函式指標指向某種特定型別,函式的型別由其引數及返回型別共同決定,與函式名無關。舉例如下:
int
add(
int nleft,
int nright)
;//函式定義
該函式型別為int(int,int),要想宣告乙個指向該類函式的指標,只需用指標替換函式名即可:
int
(*pf)
(int
,int);
//未初始化
則pf可指向int(int,int)型別的函式。pf前面有*,說明pf是指標,右側是形參列表,表示pf指向的是函式,左側為int,說明pf指向的函式返回值為int。則pf可指向int(int,int)型別的函式。而add型別為int(int,int),則pf可指向add函式。
pf = add;//通過賦值使得函式指標指向某具體函式
注意:*pf兩端的括號必不可少,否則若為如下定義:
int*pf
(int
,int);
//此時pf是乙個返回值為int*的函式,而非函式指標
普通函式指標定義
int
(*pf)
(int
,int
);
使用typedef定義函式指標型別
typedef
int(
*pf)
(int
,int
);
pf pf;
//此時,為指向某種型別函式的函式指標型別,而不是具體指標,用它可定義具體指標
pf = add;pf(
100,
100)
;//與其指向的函式用法無異
(*pf)
(100
,100);
//此處*pf兩端括號必不可少
注意:add型別必須與pf可指向的函式型別完全匹配
//第二個形參為函式型別,會自動轉換為指向此類函式的指標
void fuc
(int nvalue,
intpf
(int
,int))
;//等價的宣告,顯示的將形參定義為指向函式的指標
void fuc
(int nvalue,
int(
*pf)
(int
,int))
; void fuc
(int nvalue,pf)
;//形參中有函式指標的函式呼叫,以fuc為例:
pf = add;
//pf是函式指標
fuc(
1,add)
;//add自動轉換為函式指標
fuc(
1,pf)
;
使用typedef定義的函式指標型別作為返回引數
pf fuc2
(int);
//pf為函式指標型別
直接定義函式指標作為返回引數
int(*
fuc2
(int))
(int
,int);
//顯示定義
說明:按照有內向外的順序閱讀此宣告語句。fuc2有形參列表,則fuc2是乙個函式,其形參為fuc2(int),fuc2前面有*,所以fuc2返回乙個指標,指標本身也包含形參列表(int,int),因此指標指向函式,該函式的返回值為int.
總結:fuc2是乙個函式,形參為(int),返回乙個指向int(int,int)的函式指標。
由於c++完全相容c,則c中可用的函式指標用法皆可用於c++
typedef與decltype組合定義函式型別
typedef
decltype
(add) add2;
decltype返回函式型別,add2是與add相同型別的函式,不同的是add2是型別,而非具體函式。
使用方法
add2* pf;
//pf指向add型別的函式指標,未初始化
typedef與decltype組合定義函式指標型別
typedef
decltype
(add)
* pf2;
//pf2與1.1pf意義相同
pf2 pf;
// pf指向int(int,int)型別的函式指標,未初始化
使用推斷型別關鍵字auto定義函式型別和函式指標
auto pf = add;
//pf可認為是add的別名(個人理解)
auto
*pf = add;
//pf為指向add的指標
typedef
decltype
(add) add2;
typedef
decltype
(add)
* pf2;
void fuc2 (add2 add)
;//函式型別形參,呼叫自動轉換為函式指標
void fuc2 (pf2 add)
;//函式指標型別形參,傳入對應函式(指標)即可
說明:不論形參宣告的是函式型別:void fuc2 (add2 add);還是函式指標型別void fuc2 (pf2 add);都可作為函式指標形參宣告,在引數傳入時,若傳入函式名,則將其自動轉換為函式指標。
使用auto關鍵字
auto
fuc2
(int
)->
int(*)
(int
,int
)//fuc2返回函式指標為int(*)(int,int)
使用decltype關鍵字
decltype
(add)
*fuc2
(int
)//明確知道返回哪個函式,可用decltype關鍵字推斷其函式型別
普通成員函式指標使用舉例
class a//定義類a
public:
void
fuc()}
;typedef
void
(a::
*pf1)()
;//指標名前需加上類名限定
pf1 pf1 =
&a::fuc;
//必須有&
a a;
(a.*pf1)()
;//使用成員函式指標呼叫函式
繼承中的函式指標使用舉例
class a
void
fuc2()
};
class b:public a };
typedef
void
(a::
*pf1)()
;typedef
void
(b::
*pf2)()
;
pf1 pf1 =
&a::fuc;
intmain()
過載函式fuc
void fuc()
; void fuc
(int
);
過載函式的函式指標
void
(*pf)
(int
)= fuc;
//pf指向fuc(int)
int(
*pf2)
(int
)= fuc;
//錯誤沒有匹配的型別
c C 指標函式
我們知道,指標式記憶體首位址,那是針對變數來說的,我也知道,程式是由變數,函式組成的。那麼函式的指標是怎麼定義的呢?我們也知道函式也是存放在記憶體的 區域,它同樣有首位址,關鍵是我們怎樣才能獲取它的位址呢?如果我們定義乙個 int test int a 的函式,那麼它的位址就是函式名字test,這一...
C C 函式指標
學好函式指標有著較為重要的意義,如windows程式設計中wndclass結構體的 lpfnwndproc 成員就是乙個函式指標,下面介紹簡單的函式指標應用。void toupper char void tolower char int round double 宣告了乙個名為pf的函式指標,該函式...
C C 函式指標
1.要指向的函式的宣告 返回型別 函式名 參數列 2.對應的函式指標的宣告,返回型別和參數列與要指向的函式宣告相同 返回型別 函式指標變數名 參數列 舉例 int func int a,int b 要指向的函式的宣告 int func ptr int a,int b 對應的函式指標的宣告 inclu...