函式指標指向的是函式並不是物件。和其他指標一樣,函式指標指向某種特定型別,函式的型別由它的返回型別和形參型別共同決定,與函式名無關。
宣告指向函式的指標的語法形式:用指標替代函式名
//比較兩個string物件的長度
bool lengthcompare
(const string &
,const string &);
//pf就是指向函式的指標,該函式的形參為const string的引用,返回值為bool型別
bool (
*pf)
(const string &
,const string &);
//pf前面有個*,表示為指標;右側是形參列表,則表示pf指向的是函式;再觀察左側,函式返回型別是bool值
//*p兩端的括號不能省略
bool *pf(
const string &
,const string &);
//宣告名為pf的函式,函式返回型別為bool*
把函式名當乙個值使用時,該函式自動轉換為指標
//pf為指標,函式名當值使用,函式自動轉換為位址,取位址符可要可不要
pf=lengthcompare;
//pf指向lengthcompare函式
pf=&lengthcompare;
//與上式等價,取位址符可要可不要
可以直接使用指向該函式的指標,無須提前解引用指標
bool b1=pf(
"hello"
,"goodbye");
//呼叫lengthcompare函式
bool b2=
(*pf)
("hello"
,"goodbye");
//等價呼叫
bool b3=
lengthcompare
("hello"
,"goodbye");
//等價呼叫
可以為函式指標賦予nullptr,表示該指標沒有指向任何乙個函式。
使用過載函式的指標,形參列表和函式返回型別都必須要與過載函式中的某乙個精準匹配。
voidff(
int*);
voidff(
unsigned
int)
;void
(*pf1)ff(
unsigned
int)
;//pf1指向ff(unsigned int)
void
(*pf2)ff(
int)
=ff;
//錯誤:沒有任何乙個ff與pf2的形參列表匹配
double
(*pf3)ff(
int*
)==ff;
//錯誤:ff和pf3的返回型別不同
和陣列類似,雖然不能定義函式型別的形參,但是形參可以是指向函式的指標。這時的形參看起來是函式型別,實際上是被當指標使用
//第三個形形參看起來是函式型別,但是它會自動轉換為指向函式的指標
void
usebigger
(const string &s1,
const string &s2,bool pf
(const string &
,const string &))
;//等價的宣告:顯式地將形參定義為指向函式的指標
void
usebigger
(const string &s1,
const string &s2,bool (
*pf)
(const string &
,const string &))
;//把函式作為實參使用,它也會轉換為指標
usebigger
(s1,s2,lengthcompare)
;
使用型別別名和decltype簡化函式指標的**:
//func函式型別的別名
typedef bool func
(const string &
,const string &);
//funcp函式指標型別的別名
typedef book (
*funcp)
(const string &
,const string &
);
decltype得到的是函式型別,只有在前面加上*才能得到指標。
//func自動地轉換為函式指標
void
usebigger
(const string &
,const string &
,func)
;void
usebigger
(const string &
,const string &
,funcp)
;
編譯器自動地將func表示的函式型別轉換為指標。
使用型別別名可以定義函式型別,也可以定義指向函式型別的指標。
using f=
int(
int*
,int);
//f是函式型別,不是指標
using pf=
int(*)
(int*,
int);;
//pf是函式指標型別
pf f1
(int);
//正確:pf是指向函式的指標,f1返回的是函式的指標
f f1
(int);
//錯誤:f是函式型別,f1不能返回函式型別
f *f1
(int);
//正確:顯式地將返回型別轉換為函式的指標
int(*f1
(int))
(int*,
int)
;//f1有形參列表,所以f1是個函式;f1前面有*,所以f1返回的是乙個指標;指標的型別本身也包含形參列表,因此指標指向函式,該函式的返回型別為int
//尾置返回型別
autof1(
int)
->
int(*)
(int*,
int)
;
使用auto和decltype用於函式指標型別:decltype得到的型別,需要加上*得到函式指標,auto直接得到函式指標。
//加法
intfunc2
(int a,
int b)
//減法
intfunc3
(int a,
int b)
//乘法
intfunc4
(int a,
int b)
//除法
}int
main
(void);
system
("pause");
}
#include
#include
using namespace std;
intfunc1
(int a,
int b)
//加法
intfunc2
(int a,
int b)
//減法
intfunc3
(int a,
int b)
//乘法
intfunc4
(int a,
int b)
//除法
}//第三個形參為函式指標
void
compute
(int a,
int b,
int(
*p)(
int,
int)
)int
main
(void);
for(
auto it : vf)
system
("pause");
}
C 指標函式和函式指標
1 指標函式 1 基本概念 指標函式 顧名思義就是帶有指標的函式,即其本質是乙個函式,只不過這種函式返回的是乙個對應型別的位址。2 定義式 type func type type 如 int max int x,int y 3 例子詳解 cpp view plain copy 1.include 2...
c 指標函式和函式指標
函式指標與指標函式 1 函式指標 形式 返回型別 函式名 參數列 一種特殊的指標,它指向函式的入口 定義乙個函式指標p,只能指向返回值為int,形參為兩個int的函式 輸出結果 include stdafx.h include using namespace std int p int,int in...
C 函式指標與指標函式
函式指標 函式名本身代表著函式的位址,因此給函數指標賦值使可以不用加 符號 加也可以!void func int 定義乙個函式 void pf int 定義乙個函式指標 pf func 給函式指標賦值 int f x,y 其中x,y是形式引數,f是函式名,呼叫後返回乙個指向整型資料的位址指標。f x...