C 指针/地址差

C 指针/地址差,c,pointers,pointer-arithmetic,C,Pointers,Pointer Arithmetic,为什么这两个地址之间的差异是错误的? 首先,在不相关的指针上执行时,没有定义指针算法 其次,这是有道理的。减去指针时,得到的是这些地址之间的元素数,而不是字节数 如果你要和我一起尝试的话 char *p1 = &i, *p2 = &j; 你会得到不同的结果 作为旁注,在打印指针时请使用%p。严格来说,您的程序会导致几种未定义的行为,首先是由于不相关指针上的指针算法,然后是由于打印语句中的格式字符串和参数不匹配。然而,即使这些被纠正了,你也会看到同样的结果。差异为1的原因是指

为什么这两个地址之间的差异是错误的?


首先,在不相关的指针上执行时,没有定义指针算法

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

如果你要和我一起尝试的话

char *p1 = &i, *p2 = &j;
你会得到不同的结果



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

严格来说,您的程序会导致几种未定义的行为,首先是由于不相关指针上的指针算法,然后是由于打印语句中的格式字符串和参数不匹配。然而,即使这些被纠正了,你也会看到同样的结果。差异为1的原因是指针算法以指向类型的大小为单位给出结果-在您的例子中,
int
是4字节类型,因此减去相隔4字节的
int*
指针,结果为1。

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

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

还要注意的是,在标准中没有定义不在同一数组中的两个值的地址差,但确实适用于每个系统。

严格地说,这是正确的,但我使用过的每个实现都是“正确的”。OP的情况也是这样,你能确认这是否符合C++的标准。(我知道这是真的,但如果可能的话,我希望看到书面陈述。谢谢!)当我尝试这样做时,我在指向void的指针上得到了一个关于
算术的错误。结果是
void*
指针上的算术只被一些带有(out)特定标志的编译器支持。我将答案改为只推荐
char*
指针,这是正常工作的标准行为。
char *p1 = &i, *p2 = &j;
ptrdiff_t c = (char*)p - (char*)q;