这是在C.我正在学习C,这是来自课堂幻灯片的一个例子。
int main(int argc, char *argv[]) {
int a = 5, b = 10, c;
int *p = &a, *q = &b;
c = p - q;
printf("%d", c);
return 0;
}
我运行时的输出是3,我不明白为什么。似乎因为它正在使用&它会减去内存地址,输出的内存地址为-5。
答案 0 :(得分:5)
你正在减去指针的地址而不是它们所指向的地址,你将得到两个存储器地址之间的差异,这不能保证是任何特定的。如果您在其他计算机或编译器上运行它,则很可能是完全不同的值,因为b
和p
可以分配各种地址。例如,在我的机器上它是1.这样的现象被称为未定义的行为,原因是你不能保证所有编译器和机器都有相同的结果。
如果您取消引用q
和c = *p - *q;
这样的c
,那么您将获得-5作为p
作为两个集合值之间的差异。此外,如果您将q
和int *p = a, *q = b;
指定为c
,那么您也会将py.test mod1.py
设为-5,因为这样您就可以将指针设置为不同的地址,然后尝试访问做这样的事情在所有情况下都是一个糟糕的主意。
答案 1 :(得分:3)
减去不同数组的2个指针是未定义的行为。
当减去两个指针时,两个指针都指向同一个数组对象的元素,或者指向数组对象的最后一个元素的元素;结果是两个数组元素的下标的差异。 C11§6.5.69
相反,要获取某些数字差异,请将值转换为intptr_t
。
int main(int argc, char *argv[]) {
int a = 5, b = 10, c;
int *p = &a, *q = &b;
intptr_t ip = (intptr_t) p;
intptr_t iq = (intptr_t) q;
intptr_t diff = ip -iq;
printf("%lld", (long long) diff);
return 0;
}
当然,您打印的值可能不是5. int
的位置因编译而异。