我最近在这里发布了一些有关数组名称的问题。
感谢很多人,现在我知道数组名称不是指针,并且还知道数组名称是不可修改的 l-value 。
我还有一个关于数组的问题。
所以我知道数组名称是这样返回的。
int arr[10];
arr == &arr[0];
但是如果正确,是不是 l值,因为返回的值是地址值?
我还误会吗?
答案 0 :(得分:1)
有人告诉我数组名称被转换为数组第一个元素的地址。
这是对表达式的求值的一部分,其中出现了数组的标识符,并且有少数例外。
所以我知道数组名称是这样返回的。
int arr[10]; arr == &arr[0];
自动转换为指针-发生时自动转换为 -与表达式&arr[0]
类似(实际上首先取决于转换),但是将其视为在声明数组时立即永久执行的转换是不正确的。数组的标识符不仅标识其地址或第一个元素,还标识该数组。特别是此处自动转换为指针因子的例外,尤其是以下事实:如果arr
是数组的标识符,则sizeof(arr)
会求值为该数组的大小,而不是该大小指针。
但是如果正确,那不是l值,因为返回的值是地址值吗?
这是不对。数组的标识符为左值的原因是它指定了数组。
答案 1 :(得分:0)
根据C标准(6.3.2其他操作数)
- ... 可修改的左值是不具有数组类型的左值,没有 类型不完整,没有 constqualified类型,如果是结构或联合,则没有 任何成员(包括递归地,全部的任何成员或元素) 包含限定类型的聚集或并集。
和
3除非它是sizeof运算符的操作数或一元& 运算符,或者是用于初始化数组的字符串文字, 类型为“类型数组”的表达式将转换为 类型为“要输入的指针”的表达式指向初始 数组对象的元素,不是左值。如果数组对象 具有寄存器存储类,行为未定义。
此表达式语句
arr == &arr[0];
看起来像
&arr[0] == &arr[0];
并根据此报价(6.5.3.2地址和间接运算符)
3一元&运算符产生其操作数的地址.... 结果不是左值。
在此表达式语句中
arr == &arr[0];
类型int[10]
的不可修改的左值被隐式转换为指向其第一个元素(类型int *
)的指针,从而得到右值。