指標函式(Pointer Function)和函式指標(Pointer to Function或Function Pointer)
一、指標函式
1、解釋:指標函式很好理解:簡單來說,就是一個返回指標的函式,本質是一個函式。如:
int fun(int x,int y); //這是一個普通函式的宣告,返回值是一個int型別,是一個數值。
int *fun(in x,int y); //這就是指標函式,返回值是一個int型別的指標,是一個地址。
2、指標函式的寫法:
int *fun(in x,int y);
或int * fun(in x,int y);
或int* fun(in x,int y);
二、函式指標
1、解釋:指向資料區域的指標,稱為資料指標。指向程式碼區域的指標稱為指向函式的指標,簡稱函式指標。
函式指標,其本質是一個指標變數,只不過該指標指向的是函式而非物件,和其他指標一樣,函式指標指向某種特定型別,函式的型別由它的返回型別和形參型別共同決定,與函式名無關,例如:
//比較兩個string物件的長度
bool lengthCompare(const string &, const string &);
該函式的型別是bool (const string &, const string &)。要想宣告一個可以指向該函式的指標,只需要指標替換函式名即可:
bool (*pf) (const string &, const string &); //該指標還未初始化
這句語句的意思是,pf就是一個指向函式的指標,其中該函式的引數是兩個const string的引用,返回值是bool型別。
注意:*pf兩邊的括號必不可少。如果不寫這個括號,則pf就是一個返回值為bool指標的函數了,大家可以對比上面的指標函式。
2、函式指標的定義方法:
int (*p)(int , int ); //未初始化
或:int (*p)(int , int ) = q ; //在定義函式指標時初始化,其中q應該與指標p所指向的函式型別相同。
或:int q(int);
int (*p)(int);
p=q;
3、使用函式指標
當我們把函式名作為一個值使用時,該函式自動地轉換成指標。例如:按照如下形式我們可以將lengthCompare的地址賦給pf:
pf = lengthCompare; //pf指向名為lengthCompare的函式
pf = &lengthCompare; //同上面等價的賦值語句
此外,我們還可以直接使用函式指標呼叫該函式(下面三行是等價的):
bool b1 = pf("Hello", "Goodbye");
bool b2 = (*pf)("Hello", "Goodbye");
bool b3 = lengthCompare("Hello", "Goodbye");
注:函式指標本身也是一種資料型別,如:
int (*) (int);
是int (int)型函式的指標型別,其中的“(*)”的括號也是不能省略的。
函式指標的定義形式看起來比較複雜,所以通常採用typedef來簡化。例如:
typedef int (*Fun) (int a , int b);
表示聲明瞭一個函式指標型別。注意,此處不是定義函式指標實體。因此:
int m(int , int);
Fun funp = m; //ok
Fun = m; //錯