c专家编程一个例子的疑问

看<c专家编程>,在第九章有这么一个多维数组的例子, 代码如下:

int a[2][3][5];
int (*r)[5] = a[0];
int *t = a[0][0];

书中提到

指针所指向的数组的维数不同,其区别很大,以下为例子

r++;
t++;

将会使r和t分别指向它们各自的下一个元素,它们所增长的步长是很不相同的,因为r所指向的数组元素的大小是t所指向的数组元素的大小的三倍.

我用程序输出r和t自增前后的值,如下所示:

before increment, r is  0xbfdfa654
after increment, r is 0xbfdfa668
before increment, t is 0xbfdfa654
after increment, t is 0xbfdfa658

r增长了0x14,即20,t增长了0x4,即4,r的步长是t的步长的五倍,请问怎么会有这种区别?按照

r所指向的数组元素的大小是t所指向的数组元素的大小的三倍

这句话,r的步长不应该是t的三倍才对吗?

另外,怎么分析r和t的定义呢?

多谢

阅读 3.8k
2 个回答
cdecl> explain int (*r)[5]
declare r as pointer to array 5 of int

r 是指向五个整数的数组的指针,所以它每加 1,地址增加五个整数(的数组)的大小。

t 是指向单个整数的指针,所以它每加 1,地址增加一个整数的大小。

p 是指向大小为 n 的结构的指针,那么它每加 1,地址增加 n

t指向一维数组的第一个元素,这个一维数组有5个元素!并且t最多只能增加到4,也就是t能访问到的元素就只有 t[0],t[1],t[2],t[3],t[4]这5个元素!

当然,如果t指向的不是a[1][2],t也可以访问其他元素,否则就会越界

r指向二维数组的第一维,数组有5个元素,r++之后就指向二维数组中的下一个一维数组,数组同样有5个元素! 但是r的值最多只能增加到2(从0开始),所以r指针能够访问到的元素个数就是3*5 = 15个!

所以,r指向的数组15个元素 / t指向的数组5个元素 = 3倍~~~!

t++只是指向下一个整形,所以步长是 1

r++指向的是下一个数组,已经跨越了5个整形,所以步长是 5

所以r的步长是t的步长的5倍!~

你可以看看这个答案!

推荐问题
宣传栏