请解释下面提到的程序的输出。我认为输出应该是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;
}
答案 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”的原因。