以下代码段证明两者都相同:
int a[4];
printf("a: %p\n&a: %p", a, &a);
"0x12345678"
"0x12345678"
但编译器会在以下情况下发出警告:
int a[4], *p;
p = &a;
从不兼容的指针类型分配
&a
有哪种指针类型?
答案 0 :(得分:3)
说实话,首先,您的print语句应该是
printf("a: %p\n&a: %p", (void *)a, (void *)&a);
因为%p
需要void *
参数。请注意printf()
being a variadic function, implicit conversion (cast) won't take place,因此,需要进行投射。
现在,那说,a
是一个数组,
a
的类型为int [4]
&a
,则int (*)[4]
(但是,两者都将返回相同的地址,FWIW。)您还可以see this answer。
OTOH,在您的情况下,p
的类型为int *
。
这就是为什么你的编译器会警告你关于赋值中类型不匹配的原因。