程序输出的c程序

时间:2015-04-15 19:27:55

标签: c arrays pointers

请解释下面提到的程序的输出。我认为输出应该是1但不是1

#include <stdio.h>

int main()
{
    int  a[] = {1, 2, 3, 4, 5, 6};
    int *ptr = (int*)(&a+1);

    printf("%d ", *(ptr-1));
    getchar(); 

    return 0;
} 

2 个答案:

答案 0 :(得分:3)

这是因为&a的类型为int(*)[6],因此&a + 1 != &a[0] + 1就是您所期望的输出。

如果您打印地址&a&a[0],它们将是相同的,但递增&a与递增&a[0]不同,因为sizeof(int) != sizeof(int *)虽然并非总是如此,但您的代码不应该假设它是,或依赖于它。

此外,您似乎正在使用强制转换,因为您的编译器抱怨&a是一个不兼容的指针类型的事实,如果指针是兼容类型,则不应该需要强制转换

#include <stdio.h>

int main()
{
    int  a[] = {1, 2, 3, 4, 5, 6};
    int *ptr = &a[0] + 1;

    printf("%d\n", *(ptr-1));

    return 0;
}

应该只编译查找,输出将如您所期望的那样1

答案 1 :(得分:1)

a&a是相同的值,
a的类型为int [6]
&a的类型为int (*)[6]

这意味着

    ptr
 == (int *)(          &a + 1                )
 == (int *)( (char *) &a + 1*sizeof(*&a)    )
 == (int *)( (char *) &a + 1*sizeof(a)      )
 == (int *)( (char *) &a + 1*6*sizeof(int)  )
 == (int *)( (char *) a  + 1*6*sizeof(int)  )
 == (int *)( (char *) a  + 1*6*sizeof(*a)   )
 == (int *)(          a  + 6                )
 == &a[6]

从而

*(ptr-1) == *(a+5) == a[5] == 6

打印“6”的原因。