一、指針函數
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; //錯