让我们考虑以下代码:
int y = 20;
int *pointer_of_y = y; //Intentionally missed &
printf("%p\n",pointer_of_y);
printf("%p\n",&y);
printf("%d\n",*pointer_of_y);
输出:
0x14 //Value of 20 in hex
0x7fff56747af8 //Address of Y Variable
Segmentation fault: 11 //Value at pointer: Due to missing &
上面的代码没有执行,因为我错过了&在指针初始化。
如果它被初始化为数组,让我们考虑相同的代码。
int x[]= {10,20,30,40};
int *pointer_of_x = x;
printf("%p\n",pointer_of_x);
printf("%p\n",&x);
printf("%d\n",*pointer_of_x);
输出:
0x7fff5b5eaad0 //Pointer value
0x7fff5b5eaad0 //Address of x
10 //Value at address pointed
即使我错过了&在指针初始化。为什么数组有所作为?
答案 0 :(得分:4)
当在表达式上下文中使用数组的名称而不是sizeof
或&
的操作数时,它会衰减到pointer
到它的第一个元素。
所以这里 -
int x[]= {10,20,30,40};
x
将给出数组的第一个元素的地址,并且类型为int *
。
因此这有效 -
int *pointer_of_x = x; //works
答案 1 :(得分:2)
如果将类型为T
的数组分配给类型为T*
的指针,则该数组将衰减为其1 st 元素的地址。