请解释一下下面提到的程序的输出。我认为输出应该是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;
} 发布于 2015-04-16 03:32:08
这是因为&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。
发布于 2015-04-16 04:35:51
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“的原因。
https://stackoverflow.com/questions/29659099
复制相似问题