[問題] 多維陣列的指針偏移(懸賞300P)

作者: silverair (木柵福山雅治)   2019-12-04 06:29:34
已經看過第十二誡,但是說實話看不太懂...
就我微薄的理解和書上所學的,陣列名稱也是陣列首元素的地址
又因為陣列在記憶體中是連續的,
所以當我想要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 二維陣列,這是不合理的!"
所以我有點困惑@@
作者: LPH66 (-6.2598534e+18f)   2019-12-04 08:20:00
位址相同但指標型態不同使用陣列名會 decay (退化?) 成指向其首元素的指標二維陣列的一個元素是一列, 所以它會退化成指向首列的指標因此對它 + 1 就會移動一列而不是一個整數這和一維時退化就變成指向整數指標是不一樣的
作者: cuteSquirrel (松鼠)   2019-12-04 11:18:00
推 關鍵在2~4樓。
作者: reemir   2019-12-04 11:51:00
就指標型態不同造成的
作者: iaminanl (好MAN)   2019-12-04 13:48:00
array並不是pointer,只有一維的時候用起來一樣,超過一維或是當參數傳遞時就要回歸到array的定義
作者: MOONRAKER (㊣牛鶴鰻毛人)   2019-12-04 17:10:00
動態多維陣列怎麼會是malloc三次 後面兩個malloc都是在迴圈中 起碼也是 i*j+i+1 次這樣不會保障連續 自己印出位址來看 連續是你運氣好不然你每次迴圈都另外malloc一個沒用到的指標就知道了
作者: cuteSquirrel (松鼠)   2019-12-04 19:35:00
在C語言裡,多維array是由數個一維array層層疊起來的
作者: Bencrie   2019-12-04 20:51:00
多維陣列很少用吧。不管是 video 還是 graphics 都是一維
作者: LPH66 (-6.2598534e+18f)   2019-12-04 23:03:00
另外要最下層元素連續的多維動態陣列是有辦法的喔二維的例子見精華區 z-4-3-1-3

Links booklink

Contact Us: admin [ a t ] ucptt.com