函式指標與函式名

2021-04-15 00:31:33 字數 1326 閱讀 1594

迷惑很久的問題了,今天正好又遇到這個問題,就抽了個時間研究總結了一下把它記錄下來。

和同學討論乙個typedef的問題,實驗過程中偶然發現vs2005的行為:

int fun()                     // wrong: syntax/constraint error

f g()                   // wrong: declares that g returns a function

int f(void)          // right: f has type compatible with f

int g()                // right: g has type compatible with f

f *e(void)         // e returns a pointer to a function

f *((e))(void)   // same: parentheses irrelevant

int (*fp)(void);                  // fp points to a function that has type f

f*fp;                                //fp points to a function that has type f

typedef int f(void);和typedef int (*f)(void);含義是不同的。

還可以這樣int (*g)(void);這是宣告了乙個函式變數g,它不是個型別只是個物件。

因此可以對它賦值但不能用它定義變數。

int  f(int);

int  (*pf)(int) = &f;

初始化表示式中的&操作符是可選的,因為函式名在被使用前總是由編譯器把它轉換為函式指標,&操作符只是顯式地說明了編譯器將隱式執行的任務。

在函式指標被宣告並且被初始化之後,我們就可以使用一種方式呼叫函式:

int  ans;

ans = f(25);

ans = (*pf)(25);

ans = pf(25);

第一條語句簡單地使用名字呼叫函式f,但他的執行過程可能和你想像的不太一樣。函式名f首先被轉換為乙個函式指標,該指標制定函式在記憶體中的位置。然後,函式呼叫操作符呼叫該函式,執行開始與這個位址的**。

第二條語句對pf執行間接訪問操作,它把函式指標轉換為乙個函式名。這個轉換並不是真正需要的,因為編譯器在執行函式呼叫操作符之前又會把它轉換回去,不過,這條語句的效果和第一條完全一樣。

第三條語句和前兩條的效果一樣。間接訪問操作並非必須,因為編譯器需要的是乙個函式指標。這個例子顯示了函式指標通常是如何使用的。 

函式指標與函式名

首先函式指標的定義,如果指向無參函式,定義的時候後面一定要加 否則編輯器無法分辨這是指向函式的指標 void f 指向void 的指標 void f 指向void void 函式的指標 int f 指向int void 函式的指標 寫這個主要是因為今天突然想到,函式名,函式指標,到底都是啥?先看 i...

函式名與函式指標

對函式名和函式指標存在一些疑惑,如下 通過乙個簡單的測試程式,並對其進行反彙編,對其分析,對上述問題有了清晰的認識.先貼上測試 和反彙編 以供分析.typedef void pfunc void void func int main void main 函式的反彙編 段 pfunc p p func...

關於函式名與函式指標

示例 如下 include int asdf int a int main 問題,為什麼asdf 5 p 5 p 5 三種呼叫都正確且都能輸出正確結果?解答 首先需要明確的一點 函式名不是指標,陣列名也不是指標。函式名只是在程式設計時候代指函式入口位址的符號,函式入口位址在載入到記憶體後就是固定的,...