在给定语句中初始化指针p
int a[10], *p;
p = &a[0];
我怀疑&a[0]
的类型是pointer to int
还是int
?
读完这篇文章后,我感到困惑:
使用
a
作为指向数组中第一个元素的指针,我们可以修改[0]:*a = 7;
。
注意:我有兴趣知道&a[0]
的类型。
答案 0 :(得分:2)
&a[0]
是指向int
的指针。以下是解释步骤:
&a[0]
被解析为&(a[0])
,因为下标运算符[]
比地址运算符&
绑定得更紧。a
是一个数组,但在这种情况下会自动转换为指向其第一个元素的指针。 (如果它是sizeof
,_Alignof
或&
的操作数,或者是用于初始化数组的字符串文字,则不会被转换。)a[0]
获取指针并成为第一个元素(元素0)的左值。&(a[0])
是指向a[0]
的指针。由于我们知道a[0]
是int
,因此指向a[0]
的指针是指向int
的指针。然后为p
分配值&a[0]
。因此,p
是指向a
的第一个元素的指针。
由于p
是指向a
的第一个元素的指针,因此*p
是该元素的左值。可以在赋值的左侧使用左值来分配它引用的对象。
答案 1 :(得分:1)
&
是地址运算符,&a[0]
正在获取数组a
的第一个元素的地址,因此它是int *
。由于[]
有higher precedence而不是*
,因此您可以按以下方式阅读:
&(a[0])
可能更清楚。你有这样的情况:
p = a ;
对数组decaying to a pointer起作用。
答案 2 :(得分:1)
由于历史原因
p = a;
和
p = &a[0]
是等价的。小心那个
auto q = &a;
也是合法的,但q的类型不是int *而是int [10] *。这可能不是你想要的。
答案 3 :(得分:0)
a[0]
的地址是指向整数的指针类型。
您可以修改数组的第一个元素,因为*a
等同于*(a + 0)
,这只是a[0]
。