[问题] 多维阵列的指针偏移(悬赏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