#include <stdio.h>
int main() {
int a[4] = {1, 2, 3, 4};
int b[4] = {1, 2, 3, 4};
int n = &b[3] - &a[2];
printf("%d\n", n);
}
这个问题的输出是-3,任何人都可以解释这是怎么回事?
答案 0 :(得分:8)
减去&#34;无关&#34;指针,即指向不同对象的指针未定义。
C11-6.5.6-9
当减去两个指针时,两个指针都应该指向 相同的数组对象,或者超过数组对象的最后一个元素;
答案 1 :(得分:4)
&b[3]
是指向b
中第4个元素的指针,&a[2]
是指向a
中第3个元素的指针。然后n
将成为每个相应指针指向的内存之间的内存空间。
我不知道您是否可以指望所有编译器的结果值(-3
)相同。两个数组a
和b
并不保证在内存中彼此之间存在任何关系。
如果您希望区分b[3]
和a[2]
的值,则代码为:
int n = b[3] - a[2];
应该得到1
的结果。
答案 2 :(得分:2)
代码的输出取决于机器。您正在减去元素的地址。每次执行程序时可能会有所不同
答案 3 :(得分:0)
这是正常的,因为您正在使用地址
如果您需要结果为1而不是使用像这样的值
int n = b[3] - a[2];