已经看过第十二诫,但是说实话看不太懂...
就我微薄的理解和书上所学的,阵列名称也是阵列首元素的地址
又因为阵列在内存中是连续的,
所以当我想要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 二维阵列,这是不合理的!"
所以我有点困惑@@