討論區快速選單
知識庫快速選單
網路投保旅行平安險 軟體開發過程中有哪些資安漏洞? 掌握Salesforce雲端管理秘訣
[ 回上頁 ] [ 討論區發言規則 ]
c語法問題-結構成員指到函式記憶體位址
更改我的閱讀文章字型大小
作者 : farkeu(法客優)
[ 貼文 20 | 人氣 1524 | 評價 50 | 評價/貼文 2.5 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2009/1/15 下午 11:02:33
哈囉,
最近看很多 c 寫的程式裡面的結構, 假設結構 abc 裡的唯一成員是個函式指標, 指到一個函式 xyz 去, 結果發現兩種寫法, 一個是前面有加 &

struct abc_prototype abc = {
    .func_ptr = &xyz,
};

一個是沒有加

struct abc_prototype abc = {
    .func_ptr = xyz,
};

總覺得第一種寫法才是對的, 第二種看起來應該編譯不過, 可是最近找的程式都寫第二種且都 ok, 請問這是新增的語法規則嗎? 用起來不放心所以來請大家幫確認一下
作者 : sflam(Raymond)討論區板主 Visual C++ .NET卓越專家VC++一代宗師新手入門優秀好手資訊類作業求救頂尖高手C++一代宗師貼文超過4000則
[ 貼文 4945 | 人氣 9172 | 評價 32290 | 評價/貼文 6.53 | 送出評價 142 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2009/1/16 上午 12:45:45
兩種都可以. 函式的名字 (沒有括號) 會轉成函式指標.
作者 : wallace_tsou(Wallace) 貼文超過200則
[ 貼文 262 | 人氣 314 | 評價 960 | 評價/貼文 3.66 | 送出評價 7 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2009/1/16 上午 09:43:56
C語言會儘可能轉換可以用的資料型態(大部分電腦語言都會)。所以可以將浮點數及整數一起運算,因為中間會自行轉換。
在這堙A因為xyz是函式,在沒有括號時是取其值而非執行。但函式的值是什麼?不可能是字串,最有可能是記憶體位址(因為我是學硬體,這是唯一可以想的),是記憶體位址只有指標。所以xyz會得到指標,結果一般取出指標是&xyz,所以結果是相同的。
也就是在轉換過程中得到一樣的東西,所以不會有任何錯誤報告。
作者 : sflam(Raymond)討論區板主 Visual C++ .NET卓越專家VC++一代宗師新手入門優秀好手資訊類作業求救頂尖高手C++一代宗師貼文超過4000則
[ 貼文 4945 | 人氣 9172 | 評價 32290 | 評價/貼文 6.53 | 送出評價 142 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2009/1/16 下午 08:57:34
>在這堙A因為xyz是函式,在沒有括號時是取其值而非執行。但函式的值是什麼?不可能是字串,最有可能是記憶體位址(因為我是學硬體,這是唯一可以想的),是記憶體位址只有指標。所以xyz會得到指標,結果一般取出指標是&xyz,所以結果是相同的。

Wallace 大大所講的是據理推斷, 實際上那是語言標準所定義的. 函式的名字(不包括括號) 是個 "function designator", 這是 C99 語言標準的定義:

C99 6.3.2.1p4:

A function designator is an expression that has function type. Except when it is the
operand of the sizeof operator(54) or the unary & operator, a function designator with type "function returning type" is converted to an expression that has type "pointer to function returning type".

所以函式名字除了在 sizeof 及 & 運算子的運作下, 它會自動的轉換成函式指標.

如果在函式名字前面加 &, 那就是明確的轉換成函式指標.

註腳 54 特別說明 size(func) 的情形:
Because this conversion does not occur, the operand of the sizeof operator remains a function designator and violates the constraint in 6.5.3.4.

如果函式名字作為 sizeof 的運算元, 它不會轉換成函式指標, 也就是說它還是保留著 "function type" 的特性. 在 6.5.3.4, sizeof 運算子的說明, 第一段就明確的寫出 sizeof 不能用在 function type:
  "The sizeof operator shall not be applied to an expression that has function type ..."

所以在上面的定義下, 如果 foo 是個函式名字, sizeof(foo) 是不合法的; sizeof(&foo) 才合法.

作者 : farkeu(法客優)
[ 貼文 20 | 人氣 1524 | 評價 50 | 評價/貼文 2.5 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2009/1/19 下午 08:15:41
感謝各位的熱心解答 ^^
作者 : kenneth_deng(Kenneth_Deng)
[ 貼文 12 | 人氣 0 | 評價 0 | 評價/貼文 0 | 送出評價 8 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2009/12/3 下午 01:37:35
我也有一個小問題, xyz 是否算是一個指標常數 , 如同陣列名稱般 , 所以 &xyz=xyz , &xyz本身就是取被參考空間的位址
作者 : kenneth_deng(Kenneth_Deng)
[ 貼文 12 | 人氣 0 | 評價 0 | 評價/貼文 0 | 送出評價 8 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2009/12/3 下午 01:38:46
我也有一個小問題, xyz 是否算是一個指標常數 , 如同陣列名稱般 , 所以 &xyz=xyz , &xyz本身就是取被參考空間的位址
作者 : kenneth_deng(Kenneth_Deng)
[ 貼文 12 | 人氣 0 | 評價 0 | 評價/貼文 0 | 送出評價 8 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2009/12/3 下午 01:38:56
我也有一個小問題, xyz 是否算是一個指標常數 , 如同陣列名稱般 , 所以 &xyz=xyz , &xyz本身就是取被參考空間的位址
作者 : sflam(Raymond)討論區板主 Visual C++ .NET卓越專家VC++一代宗師新手入門優秀好手資訊類作業求救頂尖高手C++一代宗師貼文超過4000則
[ 貼文 4945 | 人氣 9172 | 評價 32290 | 評價/貼文 6.53 | 送出評價 142 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2009/12/4 上午 09:04:46
>我也有一個小問題, xyz 是否算是一個指標常數 , 如同陣列名稱般 , 所以 &xyz=xyz , &xyz本身就是取被參考空間的位址

不是很明白你的意思, 對 pointer to function 來說, const 沒有意義.
作者 : kenneth_deng(Kenneth_Deng)
[ 貼文 12 | 人氣 0 | 評價 0 | 評價/貼文 0 | 送出評價 8 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2009/12/4 上午 09:29:52

>>我也有一個小問題, xyz 是否算是一個指標常數 , 如同陣列名稱般 , 所以 &xyz=xyz , &xyz本身就是取被參考空間的位址
>
>不是很明白你的意思, 對 pointer to function 來說, const 沒有意義.
>
我是假想樓主提的 xyz應該是xyz() ,而非 *xyz() ,xyz本身應代表一個"const" address ,而非是指標"變數",在這種情況下:
1.xyz仍會是pointer to function嗎?
2.或是xyz是如同陣列名稱般 , 代表的只是一個不佔記憶體空間的位址代名,所以 &xyz=xyz , &xyz本身就是取被參考空間的位址
作者 : kenneth_deng(Kenneth_Deng)
[ 貼文 12 | 人氣 0 | 評價 0 | 評價/貼文 0 | 送出評價 8 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2009/12/4 上午 09:54:22

>我是假想樓主提的 xyz應該是xyz() ,而非 *xyz() ,xyz本身應代表一個'const' address ,而非是指標'變數',在這種情況下:
     ~~~~~
     更正一下,應該是(*xyz) ()
作者 : sflam(Raymond)討論區板主 Visual C++ .NET卓越專家VC++一代宗師新手入門優秀好手資訊類作業求救頂尖高手C++一代宗師貼文超過4000則
[ 貼文 4945 | 人氣 9172 | 評價 32290 | 評價/貼文 6.53 | 送出評價 142 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2009/12/4 下午 10:18:47
>我是假想樓主提的 xyz應該是xyz(),

不是. xyz() 是函式呼叫. 也許你的意思是: xyz 會轉為函式 xyz() 的位址, 等於 &xyz.

>而非 *xyz() ,xyz本身應代表一個'const' address ,而非是指標'變數',在這種情況下:

Address 跟變數沒有關係.

>1.xyz仍會是pointer to function嗎?

"pointer to function" 也不一定是個變數. 比方說 int i 好了, &i 會得到 pointer to int. 但這裡只有一個變數 'i', 'pointer to int' 本身不是個變數.


>2.或是xyz是如同陣列名稱般 , 代表的只是一個不佔記憶體空間的位址代名,所以 &xyz=xyz , &xyz本身就是取被參考空間的位址

是這個意思. 就像原始碼堛 string literal, 它們也不是變數.

作者 : kenneth_deng(Kenneth_Deng)
[ 貼文 12 | 人氣 0 | 評價 0 | 評價/貼文 0 | 送出評價 8 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2009/12/7 上午 12:43:18
前輩 我瞭解了 謝謝你的指點 ~
 板主 : simula
 > C++ - 討論區
 - 最近熱門問答精華集
 - 全部歷史問答精華集
 - C++ - 知識庫
  ■ 全站最新Post列表
  ■ 我的文章收藏
  ■ 我最愛的作者
  ■ 全站文章收藏排行榜
  ■ 全站最愛作者排行榜
  ■  月熱門主題
  ■  季熱門主題
  ■  熱門主題Top 20
  ■  本區Post排行榜
  ■  本區評價排行榜
  ■  全站專家名人榜
  ■  全站Post排行榜
  ■  全站評價排行榜
  ■  全站人氣排行榜
 請輸入關鍵字 
  開始搜尋
 
Top 10
評價排行
C++
1 Raymond 13050 
2 青衫 4760 
3 simula 4690 
4 coco 4030 
5 白老鼠(Gary) 3670 
6 ozzy 2540 
7 Ben 2250 
8 Anderson 1960 
9 windblown 1650 
10 Kenny 1560 
C++
  專家等級 評價  
  一代宗師 10000  
  曠世奇才 5000  
  頂尖高手 3000  
  卓越專家 1500  
  優秀好手 750  
Microsoft Internet Explorer 6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2019 程式設計俱樂部 http://www.programmer-club.com.tw/
0.1875