已經看過第十二誡,但是說實話看不太懂...
就我微薄的理解和書上所學的,陣列名稱也是陣列首元素的地址
又因為陣列在記憶體中是連續的,
所以當我想要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 二維陣列,這是不合理的!"
所以我有點困惑@@