让我们考虑以下代码:
int y = 20;
int *pointer_of_y = y; //Intentionally missed &
printf("%pn",pointer_of_y);
printf("%pn",&y);
printf("%dn",*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("%pn",pointer_of_x);
printf("%pn",&x);
printf("%dn",*pointer_of_x);
输出:
0x7fff5b5eaad0 //Pointer value
0x7fff5b5eaad0 //Address of x
10 //Value at address pointed
第二个例子是如何工作的,即使我错过了&在指针初始化中。为什么作为一个数组会有所不同?
当数组名用于表达式上下文中,而不是作为sizeof
或&
的操作数时,它的第一个元素衰变成pointer
。
所以这里-
int x[]= {10,20,30,40};
x
将给出数组第一个元素的地址,类型为int *
。因此这是有效的-
int *pointer_of_x = x; //works
如果将类型为T
的数组赋值给类型为T*
的指针,则该数组衰减为其1st元素的地址。