将地址传递给指针会导致类型提升

时间:2013-08-02 17:57:30

标签: c arrays pointers

在给定语句中初始化指针p

int a[10], *p;
p = &a[0];

我怀疑&a[0]的类型是pointer to int还是int? 读完这篇文章后,我感到困惑:

  

使用a作为指向数组中第一个元素的指针,我们可以修改[0]:*a = 7;

注意:我有兴趣知道&a[0]的类型。

4 个答案:

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