#include<stdio.h>
int main()
{
int i=10,j=20,diff;
diff=&j-&i;
printf("\nAddress of i=%u Address of j=%u",&i,&j);
printf("\nDifference of address i and j is %d\n",diff);
return 0;
}
我得到的输出是:
Address of i=3012788 Address of j=3012776
Difference of address i and j is -3
但这里的地址差异为2。
当我diff=&i-&j
时,我得到以下输出:
Address of i=2751740 Address of j=2751728
Difference of address i and j is 3
但地址之间的区别是12。
当声明两个整数变量时,第二个变量不必占用第一个变量占用的地址的下四个字节。但为什么这些差异实际上不是它的必然结果呢?
答案 0 :(得分:8)
首先,对不是来自同一内存块(数组等)的地址进行算术运算是不合法的。
你的第二个问题更有趣。你正在减去两个地址,它无视算术。这是正在发生的事情。
这是指针算术的工作原理:
pointer + x
实际上意味着pointer + sizeof *pointer
pointer1 - pointer2
实际上意味着(pointer1 - pointer2) / sizeof *either
因此,您希望12
得到3 = 12 / 4
。这是因为您平台上的int
长度为4个字节。
答案 1 :(得分:3)
计算未指向同一数组的指针之间的差异(如在您的情况下)是C中的未定义行为。有关更多信息和参考,请参阅this。
答案 2 :(得分:3)
你有没有尝试过:
diff=(int)&j-(int)&i;
答案 3 :(得分:2)
当声明了2个整数变量时,第二个变量不必占用第一个变量占用的地址的下四个字节吗?
不,地址可以在任何地方,编译器选择,除非你有一个数组。
答案 4 :(得分:1)
您正在使用指针算法。因为int是您机器上的4个字节,结果* 4是两个地址之间的距离。但是,您可以在指针上应用类似(int)的转换以获得预期的结果。