数组名称不是左值的原因是什么?

Jin*_*Jin 6 c arrays lvalue

例如,

int x[10];
int i = 0;
x = &i; //error occurs!
Run Code Online (Sandbox Code Playgroud)

根据C - A参考手册,数组名称不能是左值.因此,x不能是左值.但是,数组名称不能是左值的原因是什么?例如,为什么第三行发生错误?

dav*_*mac 6

你的参考不正确。数组可以是左值(但不能是可修改的左值),而“数组名称”(标识符)始终是左值。

举个例子:

int x[10];
int i = 0;
x = &i; //error occurs!
Run Code Online (Sandbox Code Playgroud)

应用 C11 6.5.1,第 2 段:

标识符是主要表达式,前提是它已声明为指定对象(在这种情况下,它是左值)...

我们看到这x是一个主表达式并且是一个左值,因为它之前已经被声明为指定一个数组对象。

但是,C 语言规则规定,各种上下文中的数组表达式(包括赋值表达式的左侧)将转换为指向数组第一个元素且不是左值的指针,即使阵列是。具体来说:

除非它是 sizeof 运算符、_Alignof 运算符或一元 & 运算符的操作数,或者是用于初始化数组的字符串文字,否则类型为“array of type”的表达式将转换为带有type ''pointer to type'' 指向数组对象的初始元素并且不是左值。如果数组对象具有寄存器存储类,则行为未定义。

(C11 6.3.2.1 第 3 段)。

作为上述转换结果的指针不是左值,因为左值指定了一个对象,并且没有合适的对象保存该指针值;数组对象保存数组的元素,而不是指向这些元素的指针。

您在问题中使用的示例意味着您了解数组表达式衰减(转换为)指针值,但我认为您没有认识到转换后,指针值和数组是两个不同的东西。指针不是左值;该数组可能是(在您的示例中,它是)。数组是否是左值实际上与您的示例无关;它是您尝试分配的指针值。

如果您要问:为什么数组在赋值运算符的左侧时会衰减为指针?——那我怀疑没有特别好的答案。从历史上看,C 只是不允许对数组进行赋值。