C C 的函式指標

2021-04-03 01:48:16 字數 1564 閱讀 6533

病人:醫生,我折騰了許久,無法理解函式指標。

中醫:能意識到自己不理解,不錯。那麼你說說你目前的理解。函式指標是什麼?

病人:函式指標是指向函式的指標。

中醫:那麼函式是什麼?

病人:函式就是函式。

中醫:不是指向函式的指標?

病人:自然不是。

中醫:那函式怎麼可以賦值給函式指標?難道int可以賦值給int* ?

病人:這個。。。。。。

中醫:邏輯不通了吧?

病人:是啊,怎麼回事哩?

中醫:這個問題先擱置一下,我問你,什麼是指標?

病人:是放位址的變數。

中醫:函式指標裡面放的什麼?

病人:函式入口位址。

中醫:那麼函式指標就是放函式入口位址的變數?

病人:  (小心地)我同意。

中醫:函式是放函式入口位址的常量。

病人:哇!這樣一來就好解釋了!函式賦值給函式指標就像把常量賦值給同型別變數!

中醫:還有問題嗎?

病人:有,"函式是放函式入口位址的常量。"這句話不通啊。

函式是放自己入口位址的東西?

中醫:孺字可教。這裡"函式入口位址"是乙個詞,不能拆。真正的函式,無非是一塊**,

c/c++中沒有描述"一塊**"的東西,

只有描述"一塊**"的入口位址的東西,函式及函式指標。

病人:我懂了,"函式指標是指向函式(1)的指標"和"函式(2)不是指向函式(3)的指標"的矛盾,

出自"函式(1)"的是你剛才說的"真正的函式",

函式(2)(3)指的c/c++語法意義上的"函式",兩碼事!

中醫:嗯,有道理。那麼還有問題嗎?    

病人:"函式指標是指向函式的指標。"這句話固然誤導人,不過c/c++的語法,也起到了推波助瀾的作用。

//#include

typedef int (*fn_haha)();

int real_haha()

void main(int argc, char* argv)

//既然  haha 和 real_haha是乙個層次上的東西,

那麼呼叫的時候為什麼 乙個 "real_haha();",

乙個(*haha)()哩?很明顯是在搞分化,搞腦子。

醫生:連c/c++語法你都敢批評,強的!

正如你所說,這不是好的語法,所以現在的編譯器,比如vc和gcc,

都允許用 haha();來代替傳統的(*haha)();你44就知道了。

至於書上都寫(*haha)();我只能說,

這個問題我自己也被書害了很久,最後扔了書自己想通的。

病人:我的病好了,我回去也把書扔了。

re: 病例:不理解c/c++的函式指標 2005-2-5 10:12 大怪獸

類的非靜態成員函式 和 全域性函式/靜態成員函式 的區別,

僅僅是多乙個隱含的"this"引數。

#re: 病例:不理解c/c++的函式指標 2005-3-31 14:10 tongwei

typedef void (cmsgbase::*msgproc)(void);

void cmsgbase::run(msgproc proc)

c C 指標函式

我們知道,指標式記憶體首位址,那是針對變數來說的,我也知道,程式是由變數,函式組成的。那麼函式的指標是怎麼定義的呢?我們也知道函式也是存放在記憶體的 區域,它同樣有首位址,關鍵是我們怎樣才能獲取它的位址呢?如果我們定義乙個 int test int a 的函式,那麼它的位址就是函式名字test,這一...

C C 函式指標

學好函式指標有著較為重要的意義,如windows程式設計中wndclass結構體的 lpfnwndproc 成員就是乙個函式指標,下面介紹簡單的函式指標應用。void toupper char void tolower char int round double 宣告了乙個名為pf的函式指標,該函式...

C C 函式指標

1.要指向的函式的宣告 返回型別 函式名 參數列 2.對應的函式指標的宣告,返回型別和參數列與要指向的函式宣告相同 返回型別 函式指標變數名 參數列 舉例 int func int a,int b 要指向的函式的宣告 int func ptr int a,int b 對應的函式指標的宣告 inclu...