作者james732 (好人超)
站內C_and_CPP
標題Re: [問題] 月經文...二維陣列傳入函式...
時間Tue Oct 20 03:16:53 2009
※ 引述《holymars ()》之銘言:
根據gcc的警告訊息(附於本文末, 括號內數字為行號),可以知道這些 type
: void printArray(const int a[2][3]) {
: int b[2][3];
: printf("%x\n", &a); //(7) &a 為 const int (**)[3]
: printf("%x\n", a); //(8) a 為 const int (*)[3]
: printf("%x\n", &b); //(9) &b 為 int (*)[2][3]
: printf("%x\n", b); //(10) b 為 int (*)[3]
: }
: int main() {
: int local_array[2][3];
: printf("%x\n", &local_array); (16) &local_array 為 int (*)[2][3]
: printf("%x\n", local_array); (17) local_array 為 int(*)[3]
: printArray(local_array);
: system("pause");
: return 0;
: }
沒試過還真想不到,在 printArray 裡面的四行
對 compiler 來說, printf 的第二個參數竟然是四個不同的指標
不過想想,又覺得這樣的結果好像相當的合理...XD
------
這是 gcc version 4.3.3 (Ubuntu 4.3.3-5ubuntu4) 的部份警告訊息
test.c:7: 警告: 格式 「%x」 需要類型 「unsigned int」,
但引數 2 的類型為 「const int (**)[3]」
test.c:8: 警告: 格式 「%x」 需要類型 「unsigned int」,
但引數 2 的類型為 「const int (*)[3]」
test.c:9: 警告: 格式 「%x」 需要類型 「unsigned int」,
但引數 2 的類型為 「int (*)[2][3]」
test.c:10: 警告: 格式 「%x」 需要類型 「unsigned int」,
但引數 2 的類型為 「int (*)[3]」
test.c: In function 「main」:
test.c:16: 警告: 格式 「%x」 需要類型 「unsigned int」,
但引數 2 的類型為 「int (*)[2][3]」
test.c:17: 警告: 格式 「%x」 需要類型 「unsigned int」,
但引數 2 的類型為 「int (*)[3]」
--
對了,誰知道要怎麼把它弄成英文訊息呢?
我覺得中文的沒有比較容易理解啊...orz
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 59.127.184.214
推 samuelcdf:set LC_ALL=en_us 10/20 03:25
推 QQ29:那這個跟%x不同型態的是怎麼轉換成 unsigned int阿? 10/20 03:33
→ QQ29:或是問說該怎麼消除 這warning? 10/20 03:37
→ james732:printf("%x\n", (unsigned int)&a); // 暴力消除法 XD 10/20 03:41
推 snowlike:其實有%p 10/20 08:02
推 VictorTom:用(unsigned int)轉也行, 反正指標也不過是代表記憶體 10/20 08:29
→ VictorTom:位址的一個數; 再不然就是樓上說的%p直接印了:) 10/20 08:29
推 holymars:b和local_array的type不是int (*)[3]是int [2][3] 10/20 09:09
→ holymars:sizeof(a) = 8 sizeof(b) = 24 10/20 09:10
→ holymars:可知a和b是不同的東西啊XD 10/20 09:10
→ holymars:sizeof(a)也有可能是4,根據機器上pointer幾bytes來決定 10/20 09:11
推 QQ29:那&a 是(*)[2][3]嘛? 還是(*)(*[2])[3] 不清楚 10/20 09:36
推 holymars:&a是 (**)[3]啊,因為a是(*)[3]沒錯 10/20 09:52
→ james732:我也覺得 b 應該是int[2][3] 不過為什麼會跳出int(*)[3]? 10/20 09:54
推 holymars:因為decay是自動發生,除了三種exception情況之外 10/20 10:02
→ holymars:exception 1. &b 2. sizeof(b) 3. string initializer 10/20 10:05
→ james732:原來如此 觀念還是不夠清楚 感謝解惑 :) 10/20 10:05
推 VictorTom:推謝h大的解釋:) 10/20 12:24
推 QQ29:h大 你說的第三個 是怎樣不會decay 有例子嘛@@ 10/20 12:43
推 holymars:char str[] = "Hello world."; 右邊那個const char array 10/20 13:31
→ holymars:不會decay成const char* 10/20 13:31