我不知道有关数组名称的要点

时间:2019-08-01 14:38:39

标签: c arrays implicit-conversion rvalue unary-operator

我最近在这里发布了一些有关数组名称的问题。

感谢很多人,现在我知道数组名称不是指针,并且还知道数组名称是不可修改的 l-value

我还有一个关于数组的问题。

  1. 有人告诉我数组名称被转换为数组第一个元素的地址。

所以我知道数组名称是这样返回的。

int arr[10];
arr == &arr[0];

但是如果正确,是不是 l值,因为返回的值是地址值?

我还误会吗?

2 个答案:

答案 0 :(得分:1)

  

有人告诉我数组名称被转换为数组第一个元素的地址。

这是对表达式的求值的一部分,其中出现了数组的标识符,并且有少数例外。

  

所以我知道数组名称是这样返回的。

int arr[10];
arr == &arr[0];

自动转换为指针-发生时自动转换为 -与表达式&arr[0]类似(实际上首先取决于转换),但是将其视为在声明数组时立即永久执行的转换是不正确的。数组的标识符不仅标识其地址或第一个元素,还标识该数组。特别是此处自动转换为指针因子的例外,尤其是以下事实:如果arr是数组的标识符,则sizeof(arr)会求值为该数组的大小,而不是该大小指针。

  

但是如果正确,那不是l值,因为返回的值是地址值吗?

这是对。数组的标识符为左值的原因是它指定了数组。

答案 1 :(得分:0)

根据C标准(6.3.2其他操作数)

  
      
  1. ... 可修改的左值是不具有数组类型的左值,没有   类型不完整,没有   constqualified类型,如果是结构或联合,则没有   任何成员(包括递归地,全部的任何成员或元素)   包含限定类型的聚集或并集。
  2.   

  

3除非它是sizeof运算符的操作数或一元&   运算符,或者是用于初始化数组的字符串文字,   类型为“类型数组”的表达式将转换为   类型为“要输入的指针”的表达式指向初始   数组对象的元素,不是左值。如果数组对象   具有寄存器存储类,行为未定义。

此表达式语句

arr == &arr[0];

看起来像

&arr[0] == &arr[0];

并根据此报价(6.5.3.2地址和间接运算符)

  

3一元&运算符产生其操作数的地址....   结果不是左值

在此表达式语句中

arr == &arr[0];

类型int[10]的不可修改的左值被隐式转换为指向其第一个元素(类型int *)的指针,从而得到右值。