指向int数组的指针与指向int的指针之间的语法区别

时间:2015-09-20 13:36:20

标签: c arrays pointers

让我们考虑以下代码:

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

即使我错过了&在指针初始化。为什么数组有所作为?

2 个答案:

答案 0 :(得分:4)

当在表达式上下文中使用数组的名称而不是sizeof&的操作数时,它会衰减到pointer到它的第一个元素。

所以这里 -

int x[]= {10,20,30,40};

x将给出数组的第一个元素的地址,并且类型为int *。 因此这有效 -

int *pointer_of_x = x;   //works 

答案 1 :(得分:2)

如果将类型为T的数组分配给类型为T*的指针,则该数组将衰减为其1 st 元素的地址。