作者silverair (那真是太諷刺了紹安)
看板C_and_CPP
標題[問題] 多維陣列的指針偏移
時間Wed Dec 4 06:29:34 2019
已經看過第十二誡,但是說實話看不太懂...
就我微薄的理解和書上所學的,陣列名稱也是陣列首元素的地址
又因為陣列在記憶體中是連續的,
所以當我想要print出陣列所有元素時
我可以使用指針偏移的方法去取:
int c[3] = { 0,1,2};
for (int i = 0; i < 3; i++) {
printf("%d=%d\n",i, *(c + i) );
}
這有很多範例,但我的問題出在二維、三維陣列上。
這是測試的code
https://ideone.com/LYljdX
依照上面的邏輯,靜態的二三維陣列在記憶體中應該也是連續的
所以當我想要取出所有元素:
int a[2][2][3] =
{
{ { 7,8,9},{ 3,4,5} },{ { 6,7,8 },{ 9,10,11 } }
};
int *a_ptr = a[0][0];
//int *a_ptr = a; 這樣也對
我從a的地址去取:
for (int i = 0; i < 12; i++) {
printf("%d=%d\n",i, *(a + i) );
}
這樣不行
但我改用:
for (int i = 0; i < 12; i++) {
printf("%d=%d\n",i, *(a_ptr + i) );
}
這樣的結果卻是可以的
這邊我就有點無法理解了,
a_ptr不就是指向a,也就是陣列首元素地址嗎?
為何這邊這樣用就正確了...
另外在十二誡中有指出
"但是多維陣列中,無法如此使用,事實上這也很直觀,試圖拿一個
pointer to pointer to int 來操作一個 int 二維陣列,這是不合理的!"
所以我有點困惑@@
----------------------
第二個問題是
動態陣列在記憶體中也是連續的嗎?
網路上找到是malloc三次,這樣做的三維陣列是否可以像上面那樣
print出全部的元素?
https://ideone.com/68yhYj
我自己嘗試做了,但不知道為什麼沒辦法。
會挑選一些解答贈送300p
微薄謝禮不成敬意。
--
我的意中人是個蓋世英雄,有一天他會踩著七色的雲彩來娶我
我猜中了前頭,可是我猜不著這結局。
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.36.126.205 (臺灣)
※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1575412180.A.209.html
※ 編輯: silverair (114.36.126.205 臺灣), 12/04/2019 06:47:16
推 LPH66: 位址相同但指標型態不同 12/04 08:20
→ LPH66: 使用陣列名會 decay (退化?) 成指向其首元素的指標 12/04 08:20
→ LPH66: 二維陣列的一個元素是一列, 所以它會退化成指向首列的指標 12/04 08:21
→ LPH66: 因此對它 + 1 就會移動一列而不是一個整數 12/04 08:21
→ LPH66: 這和一維時退化就變成指向整數指標是不一樣的 12/04 08:22
感謝,已發
推 cuteSquirrel: 推 關鍵在2~4樓。 12/04 11:18
→ reemir: 就指標型態不同造成的 12/04 11:51
推 iaminanl: array並不是pointer,只有一維的時候用起來一樣,超過 12/04 13:48
→ iaminanl: 一維或是當參數傳遞時就要回歸到array的定義 12/04 13:48
→ MOONRAKER: 動態多維陣列怎麼會是malloc三次 後面兩個malloc都是 12/04 17:10
→ MOONRAKER: 在迴圈中 起碼也是 i*j+i+1 次 12/04 17:10
真的,沒注意到= =
→ MOONRAKER: 這樣不會保障連續 自己印出位址來看 連續是你運氣好 12/04 17:11
→ MOONRAKER: 不然你每次迴圈都另外malloc一個沒用到的指標就知道了 12/04 17:12
→ cuteSquirrel: 在C語言裡,多維array是由數個一維array層層疊起來的 12/04 19:35
推 Bencrie: 多維陣列很少用吧。不管是 video 還是 graphics 都是一維 12/04 20:51
因為要從fortran傳三維過來
有點傷腦筋要怎麼接
推 LPH66: 另外要最下層元素連續的多維動態陣列是有辦法的喔 12/04 23:03
→ LPH66: 二維的例子見精華區 z-4-3-1-3 12/04 23:03
※ 編輯: silverair (114.36.126.205 臺灣), 12/05/2019 03:03:26