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