示例**如下:
#include
int asdf(int a)
int main()
問題,為什麼asdf(5),(*p)(5),p(5)三種呼叫都正確且都能輸出正確結果?
解答:首先需要明確的一點:函式名不是指標,陣列名也不是指標。
函式名只是在程式設計時候代指函式入口位址的符號,函式入口位址在載入到記憶體後就是固定的,編譯時函式名會被對應的函式入口位址(此位址應該是邏輯位址,在執行時才會被轉變為實際位址)替換掉,這步轉換在編譯時發生,所以不會影響執行效率。所以函式名不占用任何記憶體,編譯結束後他就沒有意義了。利用函式名呼叫函式只需要一步:
1.根據已知函式位址呼叫對應函式。
如果是函式指標它需要占用多餘的4位元組來儲存函式入口位址,並且利用函式指標呼叫函式需要多一步。
1.從指標中讀取函式入口位址。
2.呼叫對應函式。
它們之間的區別一句話概括,那就是函式名是入口位址的代號,只在編譯時發揮作用(等價於乙個固定位址,所以函式名不能被賦值),函式指標在執行期發揮作用(指標值可以變化,可以賦值)。
所以(*p)(5)與asdf(5)等價,至於為什麼(*p)(5)與p(5)結果相等,就是下面要解釋的:
利用函式指標進行呼叫:
(*p)()
p()很久很久以前c語言只允許前者,後來大家覺得這麼寫太麻煩就規定了後者能達到同樣效果。
後者在編譯時和前者做相同的事情。
它只是語法上的便利本質上是一樣的
類似的語法上的便利還有,:
p->h 通過指標訪問結構成員,等價於 (*p).h
p[n] 通過指標訪問陣列元素等價於 *(p+n)
(*p)的值與p一樣這也是乙個c標準規定的性質。沒什麼內在特殊。
int a[5][5];
printf("%p %p %p %p\n",&a[0][0],a[0],a,&a);
他們值相同但型別不同。
關於函式名與函式指標
示例 如下 include int asdf int a int main 問題,為什麼asdf 5 p 5 p 5 三種呼叫都正確且都能輸出正確結果?解答 首先需要明確的一點 函式名不是指標,陣列名也不是指標。函式名只是在程式設計時候代指函式入口位址的符號,函式入口位址在載入到記憶體後就是固定的,...
函式指標與函式名
迷惑很久的問題了,今天正好又遇到這個問題,就抽了個時間研究總結了一下把它記錄下來。和同學討論乙個typedef的問題,實驗過程中偶然發現vs2005的行為 int fun wrong syntax constraint error f g wrong declares that g returns ...
函式指標與函式名
首先函式指標的定義,如果指向無參函式,定義的時候後面一定要加 否則編輯器無法分辨這是指向函式的指標 void f 指向void 的指標 void f 指向void void 函式的指標 int f 指向int void 函式的指標 寫這個主要是因為今天突然想到,函式名,函式指標,到底都是啥?先看 i...