C C 函式指標總結

2021-10-12 17:56:21 字數 4234 閱讀 8528

函式指標指向某種特定型別,函式的型別由其引數及返回型別共同決定,與函式名無關。舉例如下:

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...