Re: [問題] 月經文...二維陣列傳入函式...

看板C_and_CPP作者 (好人超)時間16年前 (2009/10/20 03:16), 編輯推噓11(11010)
留言21則, 6人參與, 最新討論串4/4 (看更多)
※ 引述《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

10/20 03:25, , 1F
set LC_ALL=en_us
10/20 03:25, 1F

10/20 03:33, , 2F
那這個跟%x不同型態的是怎麼轉換成 unsigned int阿?
10/20 03:33, 2F

10/20 03:37, , 3F
或是問說該怎麼消除 這warning?
10/20 03:37, 3F

10/20 03:41, , 4F
printf("%x\n", (unsigned int)&a); // 暴力消除法 XD
10/20 03:41, 4F

10/20 08:02, , 5F
其實有%p
10/20 08:02, 5F

10/20 08:29, , 6F
用(unsigned int)轉也行, 反正指標也不過是代表記憶體
10/20 08:29, 6F

10/20 08:29, , 7F
位址的一個數; 再不然就是樓上說的%p直接印了:)
10/20 08:29, 7F

10/20 09:09, , 8F
b和local_array的type不是int (*)[3]是int [2][3]
10/20 09:09, 8F

10/20 09:10, , 9F
sizeof(a) = 8 sizeof(b) = 24
10/20 09:10, 9F

10/20 09:10, , 10F
可知a和b是不同的東西啊XD
10/20 09:10, 10F

10/20 09:11, , 11F
sizeof(a)也有可能是4,根據機器上pointer幾bytes來決定
10/20 09:11, 11F

10/20 09:36, , 12F
那&a 是(*)[2][3]嘛? 還是(*)(*[2])[3] 不清楚
10/20 09:36, 12F

10/20 09:52, , 13F
&a是 (**)[3]啊,因為a是(*)[3]沒錯
10/20 09:52, 13F

10/20 09:54, , 14F
我也覺得 b 應該是int[2][3] 不過為什麼會跳出int(*)[3]?
10/20 09:54, 14F

10/20 10:02, , 15F
因為decay是自動發生,除了三種exception情況之外
10/20 10:02, 15F

10/20 10:05, , 16F
exception 1. &b 2. sizeof(b) 3. string initializer
10/20 10:05, 16F

10/20 10:05, , 17F
原來如此 觀念還是不夠清楚 感謝解惑 :)
10/20 10:05, 17F

10/20 12:24, , 18F
推謝h大的解釋:)
10/20 12:24, 18F

10/20 12:43, , 19F
h大 你說的第三個 是怎樣不會decay 有例子嘛@@
10/20 12:43, 19F

10/20 13:31, , 20F
char str[] = "Hello world."; 右邊那個const char array
10/20 13:31, 20F

10/20 13:31, , 21F
不會decay成const char*
10/20 13:31, 21F
文章代碼(AID): #1AtBielJ (C_and_CPP)
文章代碼(AID): #1AtBielJ (C_and_CPP)