C 函式指標的使用

2021-10-10 20:50:18 字數 3391 閱讀 5818

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

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的函式,而非函式指標

二 標準c函式指標

1函式指標的定義

1.1 普通函式指標定義

int (*pf)(int,int);

1.2 使用typedef定義函式指標型別

typedef int (*pf)(int,int);

pf pf;//此時,為指向某種型別函式的函式指標型別,而不是具體指標,用它可定義具體指標

2函式指標的普通使用

pf = add;

pf(100,100);//與其指向的函式用法無異

(pf)(100,100);//此處pf兩端括號必不可少

注意:add型別必須與pf可指向的函式型別完全匹配

3函式指標作為形參

//第二個形參為函式型別,會自動轉換為指向此類函式的指標

void fuc(int nvalue,int pf(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);

4返回指向函式的指標

4.1 使用typedef定義的函式指標型別作為返回引數

pf fuc2(int);//pf為函式指標型別

4.2 直接定義函式指標作為返回引數

int (fuc2(int))(int,int);//顯示定義

說明:按照有內向外的順序閱讀此宣告語句。fuc2有形參列表,則fuc2是乙個函式,其形參為fuc2(int),fuc2前面有,所以fuc2返回乙個指標,指標本身也包含形參列表(int,int),因此指標指向函式,該函式的返回值為int.

總結:fuc2是乙個函式,形參為(int),返回乙個指向int(int,int)的函式指標。

二 c++函式指標

1由於c++完全相容c,則c中可用的函式指標用法皆可用於c++

2 c++其他函式(指標)定義方式及使用

2.1 typedef與decltype組合定義函式型別

typedef decltype(add) add2;

decltype返回函式型別,add2是與add相同型別的函式,不同的是add2是型別,而非具體函式。

使用方法:

add2* pf;//pf指向add型別的函式指標,未初始化

2.2 typedef與decltype組合定義函式指標型別

typedef decltype(add)* pf2;//pf2與1.1pf意義相同

pf2 pf;// pf指向int(int,int)型別的函式指標,未初始化

2.3 使用推斷型別關鍵字auto定義函式型別和函式指標

auto pf = add;//pf可認為是add的別名(個人理解)

auto *pf = add;//pf為指向add的指標

3函式指標形參

typedef decltype(add) add2;

typedef decltype(add)* pf2;

void fuc2 (add2 add);//函式型別形參,呼叫自動轉換為函式指標

void fuc2 (pf2 add);//函式指標型別形參,傳入對應函式(指標)即可

說明:不論形參宣告的是函式型別:void fuc2 (add2 add);還是函式指標型別void fuc2 (pf2 add);都可作為函式指標形參宣告,在引數傳入時,若傳入函式名,則將其自動轉換為函式指標。

4 返回指向函式的指標

4.1 使用auto關鍵字
1

auto fuc2(int)-> int()(int,int) //fuc2返回函式指標為int()(int,int)

4.2 使用decltype關鍵字

decltype(add)* fuc2(int)//明確知道返回哪個函式,可用decltype關鍵字推斷其函式型別,

5 成員函式指標

5.1普通成員函式指標使用舉例

class a//定義類a

public:

void fuc()  

typedef void(a::*pf1)();//指標名前需加上類名限定

pf1 pf1 = &a::fuc; //必須有&

(a.*pf1)();//使用成員函式指標呼叫函式

5.2繼承中的函式指標使用舉例
class a

void fuc2()  

class b:public a

typedef void(a::*pf1)();

typedef void(b::*pf2)();

pf1 pf1 = &a::fuc;

int main()

{a a;

b b;

(a.*pf1)(); //呼叫a::fuc

(b.*pf1)(); //呼叫a::fuc

pf1 = &a::fuc2;  

(a.*pf1)(); //呼叫a::fuc2

(b.*pf1)(); //呼叫a::fuc2

pf2 pf2 = &a::fuc2;

(b.*pf2)(); //呼叫a::fuc2

6過載函式的指標

6.1 過載函式fuc
void fuc();

void fuc(int);

6.2 過載函式的函式指標

void (*pf)(int) = fuc;//pf指向fuc(int)

int(*pf2)(int) = fuc;//錯誤沒有匹配的型別

c 函式指標的使用

關於c 中函式指標的使用 包含對typedef用法的討論 一 簡單的函式指標的應用。形式1 返回型別 函式名 參數列 char pfun int char glfun int a void main 第一行定義了乙個指標變數pfun。首先我們根據前面提到的 形式1 認識到它是乙個指向某種函式的指標,...

C 中指標函式與函式指標的使用

指標函式 指標函式是乙個函式,只不過指標函式返回的型別是某一型別的指標。格式 型別名 函式名 函式引數列表 使用 指標函式,返回int 指標變數 int add int a,int b int main 函式指標 函式指標是指向函式的指標變數。所以函式指標其實是指標變數,只不過該指標變數指向函式。格...

C 中函式指標的使用

在c c 中存在著函式指標,即指向函式的指標。我目前已知的兩種使用方法是 include include typedef int pinnt define pp int int funca int a,int b int funcb int a,int b int main int argc,cha...