1. 程式人生 > >指標函式(Pointer Function)和函式指標(Pointer to Function或Function Pointer)

指標函式(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;    //錯