[問題] Function pointer

看板C_and_CPP作者 (我討厭)時間11年前發表 (2014/08/05 13:38), 11年前編輯推噓2(205)
留言7則, 6人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) gcc 問題(Question): 為何ptr 餵入function而非 function address這樣也能? #incldue <stdio.h> typedef int (*funcp)(); int foo1(){ printf("Hello World! \n"); } int main(){ funcp ptr; ptr = fool; ptr(); getchar(); return 0; } 餵入的資料(Input): ptr = fool; ptr = &fool; 預期的正確結果(Expected Output): ptr = fool; 應該compiler fail..卻compiler過了 程式碼(Code):(請善用置底文網頁, 記得排版) 補充說明(Supplement): -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 203.77.53.191 ※ 文章網址: http://www.ptt.cc/bbs/C_and_CPP/M.1407245888.A.E19.html ※ 編輯: IhateOGC (203.77.53.191), 08/05/2014 21:38:34

08/05 21:39, , 1F
可自動轉型
08/05 21:39, 1F
int自動轉型成address Q_Q? ※ 編輯: IhateOGC (203.77.53.191), 08/05/2014 21:56:10

08/05 21:57, , 2F
不是int, 是 function
08/05 21:57, 2F
偷轉一下..XD http://www.programmer-club.com.tw/ShowSameTitleN/c/25059.html 作者 : sunyear(coco) VC++卓越專家C++頂尖高手貼文超過2000則 [ 貼文 2287 | 人氣 1485 | 評價 5850 | 評價/貼文 2.56 | 送出評價 5 次 ] [ 給個讚 ] [ 給個讚 ] [ 回應本文 ] [ 發表新文 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ] 2005/1/9 下午 08:52:55 當你在宣告一個變數時是這樣的: int ImVar;//<-----------------------1 當你在宣告一個函式時卻是這樣: int ImFun(...);//---------------------2 變數宣告時名稱在最後面,而函式名稱卻在中間, 你會不會覺得這很奇怪? 本來用一個小括號括起來的參數定義就是函式名稱的附屬品 你可以當它是函式名稱的一部份。沒有了它函式名稱就不完整了。 (注意在C++中不同參數的同名函式在編譯器的內部函式名稱是不同的) typedef int INT;//<------------------3 typedef int *PINT;//<--------------4 typedef int (*PINT);//<--------------5 3式是定義一個int的型態,名為INT 4式是定義一個int的指標型態,名為PINT 5式是定義一個指向int的指標型態,名為PINT 4式和5式的結果是等效的。 現在我們嘗試為函式定義型態: typedef int IntFun(...);//<------------60m 先注意到有關2式的說明,就不應再對為何函式名稱後還有(...) 6式定義一個型態(或返回)int函式,名稱為IntFun。 我們知道,函式名本身俱有隱性指標的性質,所以IntFun和 *IntFun是0m 等效的。 那麼可以明白的定義IntFun為指標嗎,應該可以的!直觀的感覺是套入 4式: typedef int * IntFun(...);//<------------7 問題出來了,任何一個編譯器都會把7式解讀為: 定義一個型態(或返回)int *函式,名稱為IntFun。 這不是我們要的,那要如何指定指標('*')給IntFun而不是int呢? 答案就是括號,也就是套入5式而不是4式: typedef int (*IntFun)(...);//<------------80m 這就是原提問要的解答了,唯要注意的是 對型態的定義來說 4式和5式是等效的, 但對函式的定義來說6式和8式才是等效的; 那麼使用6式或8式效好? 一般都使用8弍,它有較好的可讀性,隱式指標總是令人較為困感的。 而且也不敢保證所有的編譯器都可以接受6式的敘述。 ※ 編輯: IhateOGC (203.77.53.191), 08/05/2014 22:16:30

08/05 23:43, , 3F
foo1 會被自動轉成函數指標; #1ECoOqLM
08/05 23:43, 3F

08/05 23:50, , 4F
thx
08/05 23:50, 4F

08/05 23:51, , 5F
可是我記得以前寫 ptr = fool 執行時會 hang 住
08/05 23:51, 5F

08/05 23:51, , 6F
ptr = &fool 可以正確執行
08/05 23:51, 6F

08/06 00:20, , 7F
一個是1一個是l你在筆誤嗎?
08/06 00:20, 7F
文章代碼(AID): #1JuDv0uP (C_and_CPP)