→ azureblaze:可自動轉型 08/05 21:39
int自動轉型成address Q_Q?
※ 編輯: IhateOGC (203.77.53.191), 08/05/2014 21:56:10
→ CaptainH:不是int, 是 function 08/05 21:57
偷轉一下..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
→ IhateOGC:thx 08/05 23:50
→ PUTOUCHANG:可是我記得以前寫 ptr = fool 執行時會 hang 住 08/05 23:51
→ PUTOUCHANG:ptr = &fool 可以正確執行 08/05 23:51
推 damody:一個是1一個是l你在筆誤嗎? 08/06 00:20