C 我能';我不明白数组名的意义所在
我最近在这里发布了一些关于数组名称的问题 感谢很多人,现在我知道数组名不是指针,也知道数组名是不可修改的l值 我还有一个关于数组的问题C 我能';我不明白数组名的意义所在,c,arrays,implicit-conversion,rvalue,unary-operator,C,Arrays,Implicit Conversion,Rvalue,Unary Operator,我最近在这里发布了一些关于数组名称的问题 感谢很多人,现在我知道数组名不是指针,也知道数组名是不可修改的l值 我还有一个关于数组的问题 我被告知数组名被转换为数组第一个元素的地址 所以我知道数组名是这样返回的 int arr[10]; arr == &arr[0]; int arr[10]; arr == &arr[0]; 但是如果它是正确的,它不是一个l值,因为返回的值是一个地址值吗 我还是误会吗 我被告知数组名被转换为数组第一个元素的地址 这是数组标识符出现时表达式求值的
int arr[10];
arr == &arr[0];
int arr[10];
arr == &arr[0];
但是如果它是正确的,它不是一个l值,因为返回的值是一个地址值吗
我还是误会吗
我被告知数组名被转换为数组第一个元素的地址
这是数组标识符出现时表达式求值的一部分,有少数例外情况
所以我知道数组名是这样返回的
int arr[10];
arr == &arr[0];
int arr[10];
arr == &arr[0];
指针的自动转换(发生时)类似于表达式&arr[0]
(实际上首先取决于该转换),但在声明数组时将其视为立即且永久执行的转换是不正确的。数组的标识符标识数组,而不仅仅是它的地址或它的第一个元素。特别是,此处自动转换为指针因子的例外情况,特别是如果arr
是数组的标识符,则sizeof(arr)
的计算结果是该数组的大小,而不是指针的大小
但是如果它是正确的,它不是一个l值,因为返回的值是一个地址值吗
这是不对的。数组标识符是左值的原因是它指定数组。根据C标准(6.3.2其他操作数)
arr == &arr[0];
arr == &arr[0];
看起来像
&arr[0] == &arr[0];
根据本报价(6.5.3.2地址和间接运算符)
3一元&运算符产生其操作数的地址…,
结果不是左值
这是在这个表达式语句中
arr == &arr[0];
arr == &arr[0];
int[10]
类型的不可修改左值隐式转换为指向其第一个元素(即int*
类型)的指针,从而获得右值。左值是一个可能指定对象别名的值。指针不是它指向的对象的左值,您必须跟随指针,即取消引用它arr
是一个l值。它在许多上下文中衰减为指向其第一个元素的指针,但为l值。您不能更改&arr[0]
(即,arr=NULL;
是非法的)。您可以更改地址&arr[0]
(即*(&arr[0])=42;
(与arr[0]=42;
或*arr=42;
相同)