为什么两个地址之间的区别是错误的? 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
答案 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的结果。