数组地址和数组本身有什么区别吗?

时间:2015-07-02 11:05:56

标签: c arrays pointers memory-address

以下代码段证明两者都相同:

int a[4];
printf("a: %p\n&a: %p", a, &a);
"0x12345678"
"0x12345678"

但编译器会在以下情况下发出警告:

int a[4], *p;
p = &a; 
  

从不兼容的指针类型分配

&a有哪种指针类型?

1 个答案:

答案 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 *

这就是为什么你的编译器会警告你关于赋值中类型不匹配的原因。