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.如何变得可能?
答案 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 ]
您正在打印相邻的1
和3
地址之间的差异,即恰好有1 int
的价值它们之间的字节。
另外,打印指针差异并不正确,就好像它是int
(带%d
)一样。正确的方法是使用"%" PRIdPTR
并转换为intptr_t
。