1. 程式人生 > >函式指標變數和指標型函式的區別

函式指標變數和指標型函式的區別

函式指標變數和指標型函式的區別

  在上一篇隨筆(順序表基本操作演算法的程式碼實現)中,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){}這個例子中,指標型       函式的意義是函式返回一個指向整數型別指標變數。

三、結語

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