(39)函式指標

2021-07-24 22:37:35 字數 1656 閱讀 9447

函式指標指向的是函式而非物件。和其他指標一樣,函式指標指向某種特定型別。函式的型別由它的返回型別和形參型別共同決定,與函式名無關。

當我們把函式名作為乙個值使用時,該函式自動地轉換成指標。直接使用指向含稅的指標呼叫該函式,無須以前解引用指標。

在指向不同函式型別的指標間不存在轉換規則。但是和往常一樣,我們可以為函式指標賦給乙個nullptr或者值為0的整箱常量表示式表示該指標沒有指向任何乙個函式。

編譯器通過指標型別決定選用那個函式,指標型別必須與過載函式中的某乙個精確匹配。

雖然不能定義函式型別的形參,但是形參可以是指向函式的指標。此時,形參看起來是函式型別,實際上卻是當成指標使用:

//第三種形參是函式型別,它會自動地轉換成指向函式的指標

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 &));

我們可以直接把函式作為實參使用,此時它會自動轉換成指標:

//自動將函式lengthcompare轉換成指向該函式的指標

usebigger(s1,s2,lengthcompare);

使用decltype簡化宣告:

//func和func2是函式型別

typedef bool func(const string &,const string &);

typedef decltype(lengthcompare) func2; //等價的型別

//funcp和funcp2是指向函式的指標

typedef bool (*funcp)(const string &,const string &);

typedef decltype(lengthcompare) *funcp2; //等價的型別

decltype返回函式型別,此時不會將函式型別自動轉換成指標型別。因為decltype的結果是函式型別,所以只有在結果前面加上*才能得到指標。

想返回函式型別的指標,我們必須把返回型別寫成指標形式,編譯器不會自動地將函式返回型別當成對應的指標型別處理。要想宣告乙個返回函式指標的函式,最簡單的辦法是使用型別別名:

using f = int (int*,int);             //f是函式型別,不是指標

using pf = int(*) (int*,int); //pf是指標型別

和函式型別的形參不一樣,返回型別不會自動地轉換成指標。我們必須顯式地將返回型別指定為指標:

pf f1(int);

f *f1(int);

當然,我們也能用下面的形式直接顯式宣告f1:

int (*f1(int))(int*,int);
使用尾置返回型別的方式宣告乙個返回函式指標的函式:

auto f1(int)->int(*)(int *,int);

函式指標 指標函式

a char fun1 char p1,char p2 b char fun2 char p1,char p2 c char fun3 char p1,char p2 後兩個都不難理解,那麼第乙個是什麼呢?這裡fun1 不是什麼函式名,而是乙個指標變數,它指向乙個函式。這個函式有兩個指標型別的引數,...

函式指標 指標函式

函式指標和指標函式,很多同學分不清楚,其實我們沒有必要刻意去區分他們的概念,可以自己寫乙個例子,就很容易明白他們各自的用途了!include include include int test int m,int n,int pfunc int a,int b int add int,int int ...

函式指標 指標函式

如果在函式中定義了乙個函式,在編譯時,編譯系統為函式 分配一段儲存空間,這段儲存空間的起始位址 又稱入口位址 稱為這個函式的指標。定義一般函式指標的形式 型別名 指標變數名 函式引數列表 例子 int p int,int p是乙個指向函式的指標變數。p的型別為 int int,int 表示。指標函式...