C数组变量&地址计算

时间:2015-04-09 09:41:40

标签: c

int a[2][2]={{2,3},{1,6}};
printf(“%d”,&a[1][0] - &a[0][1]);

这里,[0] [1]和[1] [0]是两个连续的整数项。由于每个整数需要4个字节,因此它们之间应该有4个字节的差异。所以,答案应该是4。 但我认为,地址减法是非法的。在Dev-C ++中,它也会产生编译错误。但是给定的输出是1.如何变得可能?

2 个答案:

答案 0 :(得分:4)

你正在对int指针进行减法,所以得到“sizeof(int)units”的结果。 如果你运行当前代码,它将打印1,因为那些整数确实是彼此相邻的。

您可能想要做的是将地址算术为数字:

int a[2][2]={{2,3},{1,6}};
printf("%" PRIiPTR,(intptr_t)&a[1][0] - (intptr_t)&a[0][1]);

将指针投射到intptr_t(在标题stdint.h中)是一种方法。

PRIiPTR是一个宏(来自标题inttypes.h),用于输出带有printf的inptr_t变量。

答案 1 :(得分:2)

不,它不应该是4。

您的假设不正确:指针算法以指向的类型(即sizeof (int)此处),(以字节为单位)完成。

你的数组在内存中看起来像这样:

[ 2 | 3 | 1 | 6 ]

您正在打印相邻的13地址之间的差异,即恰好有1 int的价值它们之间的字节。

另外,打印指针差异并不正确,就好像它是int(带%d)一样。正确的方法是使用"%" PRIdPTR并转换为intptr_t