看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《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