關於函式名與函式指標

2021-07-05 02:41:44 字數 945 閱讀 8391

示例**如下:

#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...