指针/地址差异

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

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

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

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

如果你试着用它

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

你会得到不同的结果。


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

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

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

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

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