[問題] 多維陣列的指針偏移

看板C_and_CPP作者 (那真是太諷刺了紹安)時間5年前發表 (2019/12/03 22:29), 5年前編輯推噓5(5012)
留言17則, 6人參與, 5年前最新討論串1/1
已經看過第十二誡,但是說實話看不太懂... 就我微薄的理解和書上所學的,陣列名稱也是陣列首元素的地址 又因為陣列在記憶體中是連續的, 所以當我想要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

12/04 08:20, 5年前 , 1F
位址相同但指標型態不同
12/04 08:20, 1F

12/04 08:20, 5年前 , 2F
使用陣列名會 decay (退化?) 成指向其首元素的指標
12/04 08:20, 2F

12/04 08:21, 5年前 , 3F
二維陣列的一個元素是一列, 所以它會退化成指向首列的指標
12/04 08:21, 3F

12/04 08:21, 5年前 , 4F
因此對它 + 1 就會移動一列而不是一個整數
12/04 08:21, 4F

12/04 08:22, 5年前 , 5F
這和一維時退化就變成指向整數指標是不一樣的
12/04 08:22, 5F
感謝,已發

12/04 11:18, 5年前 , 6F
推 關鍵在2~4樓。
12/04 11:18, 6F

12/04 11:51, 5年前 , 7F
就指標型態不同造成的
12/04 11:51, 7F

12/04 13:48, 5年前 , 8F
array並不是pointer,只有一維的時候用起來一樣,超過
12/04 13:48, 8F

12/04 13:48, 5年前 , 9F
一維或是當參數傳遞時就要回歸到array的定義
12/04 13:48, 9F

12/04 17:10, 5年前 , 10F
動態多維陣列怎麼會是malloc三次 後面兩個malloc都是
12/04 17:10, 10F

12/04 17:10, 5年前 , 11F
在迴圈中 起碼也是 i*j+i+1 次
12/04 17:10, 11F
真的,沒注意到= =

12/04 17:11, 5年前 , 12F
這樣不會保障連續 自己印出位址來看 連續是你運氣好
12/04 17:11, 12F

12/04 17:12, 5年前 , 13F
不然你每次迴圈都另外malloc一個沒用到的指標就知道了
12/04 17:12, 13F

12/04 19:35, 5年前 , 14F
在C語言裡,多維array是由數個一維array層層疊起來的
12/04 19:35, 14F

12/04 20:51, 5年前 , 15F
多維陣列很少用吧。不管是 video 還是 graphics 都是一維
12/04 20:51, 15F
因為要從fortran傳三維過來 有點傷腦筋要怎麼接

12/04 23:03, 5年前 , 16F
另外要最下層元素連續的多維動態陣列是有辦法的喔
12/04 23:03, 16F

12/04 23:03, 5年前 , 17F
二維的例子見精華區 z-4-3-1-3
12/04 23:03, 17F
※ 編輯: silverair (114.36.126.205 臺灣), 12/05/2019 03:03:26
文章代碼(AID): #1Tvk7K89 (C_and_CPP)