以下是问题计划:
#include <stdio.h>
int main()
{
int apricot[2][3][5];
int (*r)[5]=apricot[0];
int *t=apricot[0][0];
printf("%p\n%p\n%p\n%p\n",r,r+1,t,t+1);
}
它的输出是:
# ./a.out
0xbfa44000
0xbfa44014
0xbfa44000
0xbfa44004
我认为维度的值应该是5,因为t是最后一个维度,事实匹配(0xbfa44004-0xbfa44000 + 1 = 5)
但是r的维度值是 0xbfa44014-0xbfa44000 + 1 = 21,我认为应该是3 * 5 = 15 ,因为3和5是最后一个两个维度,那么为什么差异是21?
答案 0 :(得分:4)
r
是一个指向5个int数组的指针。
假设1 int是你系统上的4个字节(来自t
和t+1
),那么将指针“踩”1(r+1
)意味着增加5 * 4 = 20个字节。这就是你在这里得到的。
答案 1 :(得分:1)
您会被C语法欺骗。 r
是一个int数组的数组指针,t
是一个普通的int指针。在进行任何类型的指针运算时,可以在指向的单位进行。
因此t+1
表示t
的地址+一个指向对象的大小。由于int和int的t点在系统上是4个字节,因此从t
获得4个字节的地址。
同样的规则适用于r
。它是一个指向5 int数组的指针。当你通过r+1
对它进行指针运算时,你会得到指向对象的大小,其大小为5*sizeof(int)
,恰好是你计算机上的20个字节。因此r+1
为r
提供了一个20字节(== 14十六进制)的地址。