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

 

  

  

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM