指针/地址差异

Ava*_*Ava 8 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;
}
Run Code Online (Sandbox Code Playgroud)

输出:

-1083846364
-1083846368
1
Run Code Online (Sandbox Code Playgroud)

cni*_*tar 21

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

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

如果你想尝试一下

char *p1 = &i, *p2 = &j;
Run Code Online (Sandbox Code Playgroud)

你会得到不同的结果.


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


Mac*_*cil 10

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

ptrdiff_t c = (char*)p - (char*)q;
Run Code Online (Sandbox Code Playgroud)

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