函數指針變量和指針型函數的區別


  在上一篇隨筆(順序表基本操作算法的代碼實現)中,LocateElem()函數的第三個形參的形式是:

    Status (*compare)(Elemtype e,Elemtype temp);

  這是一個函數指針變量,借此機會記錄一下函數指針變量和指針型函數的區別。

一、寫法上的區別

函數指針變量 指針型函數
int (*function)(int i); int  *function(int i){}

 

 

  上面是一個例子,可看到函數指針變量只是在:*function處比指針型函數多了一對小括號,下面是兩者的一般形式:

函數指針變量:

類型類型說明符 (*指針變量名)(形參表);

指針型函數:

類型說明符 *函數名(形參表){

}

二、概念上區別

  • 函數指針變量:指向函數入口的指針變量(本質是變量)

    在隨筆的開頭,LocateElem函數的形參中就有一個函數指針變量,在函數的調用過程中,只要將真正要使用的函數名作為實參傳遞,就可以調用改函數。為什么會這樣           呢?因為函數在使用時,函數的名稱就像數組名一樣表示了一個地址,名稱指向了函數的入口地址。通過將函數名賦值給一個函數指針變量,這個函數指針變量就指向了一個         特定函數;類似於定義一個變量,將數組的首地址賦值給該變量,就可以通過該指針處理這個數組。

  • 指針型函數:返回值為指針類型的函數(本質是函數)

    既然只指針型函數的本質是一個函數,則它一定具有相應的函數體。而這個函數與一般函數的區別就是他的返回值是一個指針類型,這里有點迷惑人的地方是:

      函數頭上已經寫了返回值的類型說明符是int(見一中的例子),為什么又說返回值是一個指針類型呢?這個理解是有些偏差的。

    首先要清楚的是,定義一個指針變量,是得要確定指針指向的變量類型的。比如說:int *p;

  上個語句執行后,會產生一個指針p,他指向一個整數類型。以此類推,在指針型函數中,類型說明符是對指針變量的一個說明,在int  *function(int i){}這個例子中,指針型       函數的意義是函數返回一個指向整數類型指針變量。

三、結語

  在分辨這兩個概念時,只要時刻謹記他們的本質就可以:函數指針變量本質是變量,那么對於變量的一切操作,它都兼容;指針型函數是一個函數,只是說函數的返回值比較特殊,是一個指向類型說明符的指針變量。

 


免責聲明!

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



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