[問題] Function pointer
開發平台(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
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
08/05 23:43, 3F
→
08/05 23:50, , 4F
08/05 23:50, 4F
→
08/05 23:51, , 5F
08/05 23:51, 5F
→
08/05 23:51, , 6F
08/05 23:51, 6F
推
08/06 00:20, , 7F
08/06 00:20, 7F