请解释输出

时间:2014-08-01 16:02:35

标签: c

#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,任何人都可以解释这是怎么回事?

4 个答案:

答案 0 :(得分:8)

减去&#34;无关&#34;指针,即指向不同对象的指针未定义。

C11-6.5.6-9

  

当减去两个指针时,两个指针都应该指向   相同的数组对象,或者超过数组对象的最后一个元素;

答案 1 :(得分:4)

&b[3]是指向b中第4个元素的指针,&a[2]是指向a中第3个元素的指针。然后n将成为每个相应指针指向的内存之间的内存空间。

我不知道您是否可以指望所有编译器的结果值(-3)相同。两个数组ab并不保证在内存中彼此之间存在任何关系。

如果您希望区分b[3]a[2]的值,则代码为:

int n = b[3] - a[2];

应该得到1的结果。

答案 2 :(得分:2)

代码的输出取决于机器。您正在减去元素的地址。每次执行程序时可能会有所不同

答案 3 :(得分:0)

这是正常的,因为您正在使用地址

如果您需要结果为1而不是使用像这样的值

int n = b[3] - a[2];