[問題] 多維陣列的指針偏移
看板C_and_CPP作者silverair (那真是太諷刺了紹安)時間5年前發表 (2019/12/03 22:29), 5年前編輯推噓5(5推 0噓 12→)留言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
12/04 08:20, 2F
→
12/04 08:21,
5年前
, 3F
12/04 08:21, 3F
→
12/04 08:21,
5年前
, 4F
12/04 08:21, 4F
→
12/04 08:22,
5年前
, 5F
12/04 08:22, 5F
感謝,已發
推
12/04 11:18,
5年前
, 6F
12/04 11:18, 6F
→
12/04 11:51,
5年前
, 7F
12/04 11:51, 7F
推
12/04 13:48,
5年前
, 8F
12/04 13:48, 8F
→
12/04 13:48,
5年前
, 9F
12/04 13:48, 9F
→
12/04 17:10,
5年前
, 10F
12/04 17:10, 10F
→
12/04 17:10,
5年前
, 11F
12/04 17:10, 11F
真的,沒注意到= =
→
12/04 17:11,
5年前
, 12F
12/04 17:11, 12F
→
12/04 17:12,
5年前
, 13F
12/04 17:12, 13F
→
12/04 19:35,
5年前
, 14F
12/04 19:35, 14F
推
12/04 20:51,
5年前
, 15F
12/04 20:51, 15F
因為要從fortran傳三維過來
有點傷腦筋要怎麼接
推
12/04 23:03,
5年前
, 16F
12/04 23:03, 16F
→
12/04 23:03,
5年前
, 17F
12/04 23:03, 17F
※ 編輯: silverair (114.36.126.205 臺灣), 12/05/2019 03:03:26