在上一篇隨筆(順序表基本操作算法的代碼實現)中,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){}這個例子中,指針型 函數的意義是函數返回一個指向整數類型指針變量。
三、結語
在分辨這兩個概念時,只要時刻謹記他們的本質就可以:函數指針變量本質是變量,那么對於變量的一切操作,它都兼容;指針型函數是一個函數,只是說函數的返回值比較特殊,是一個指向類型說明符的指針變量。