指针/地址差异

时间:2012-03-24 20:47:55

标签: c pointers pointer-arithmetic

为什么两个地址之间的区别是错误的? http://codepad.org/NGDqFWjJ

#include<stdio.h>
int main()
{
   int i = 10, j = 20;
   int *p = &i;
   int *q = &j;
   int c = p - q;
   printf("%d\n", p);
   printf("%d\n", q);
   printf("%d", c);
   return 0;
}

输出:

-1083846364
-1083846368
1

3 个答案:

答案 0 :(得分:20)

首先,在不相关的指针上执行时,未定义指针运算。

其次,这是有道理的。当减去指针时,你得到这些地址之间的元素数,而不是字节数。

如果您尝试使用

char *p1 = &i, *p2 = &j;

你会得到不同的结果。


作为旁注,请在打印指针时使用%p

答案 1 :(得分:9)

正如其他人所说,你得到的结果是指针指向的类型大小的倍数。将它们转换为char指针,你得到的结果将是字节数。此外,您应该使用ptrdiff_t type,以便在具有64位指针的系统上,类型应足够大以容纳结果。

ptrdiff_t c = (char*)p - (char*)q;

另请注意,标准中未定义不在同一数组中的两个值的地址差异,但对每个系统都有效。

答案 2 :(得分:2)

严格地说,您的程序会导致一些未定义的行为,首先是由于对不相关指针的指针运算,然后是打印语句中的格式字符串和参数不匹配。但是,即使这些被纠正,你也会看到相同的结果。差异为1的原因是因为指针算法以指向类型的大小为单位给出结果 - 在您的情况下int是4字节类型,因此减去指向4字节的int *指针分开产生1的结果。