c中两个整数变量之间的地址差异

时间:2011-09-03 09:21:29

标签: c

#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。

当声明两个整数变量时,第二个变量不必占用第一个变量占用的地址的下四个字节。但为什么这些差异实际上不是它的必然结果呢?

5 个答案:

答案 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)的转换以获得预期的结果。