为什么数组名称是指向数组第一个元素的指针?

cha*_*rre 8 c arrays pointers

总是这样,我的意思是,数组名称总是指向数组的第一个元素的指针.为什么它是这样的呢?它是实现有点事物还是语言特征?

Car*_*rum 16

数组名称本身不是指针,但在大多数上下文中衰减为指向数组的第一个元素的指针.就是这样,因为语言就是这样定义的.

从C11 6.3.2.1左值,数组和函数指示符,第3段:

除非它是运算sizeof符,_Alignof运算符或一元运算&符的操作数,或者是用于初始化数组的字符串文字,否则将类型为"数组类型 "的表达式转换为类型为"指向类型的指针"的表达式"它指向数组对象的初始元素,而不是左值.

您可以从comp.lang.c FAQArrays and Pointers部分了解有关此主题的更多信息(以及涉及的微妙行为).

编辑抛开:同样的行为发生在C++中,尽管语言指定它有点不同.作为参考,我在这里有一个C++ 11草案,4.2数组到指针的转换,第1段:

"数组N T"或"未知范围的数组" 类型的左值或右值T可以转换为"指向T" 的类型的右值.结果是指向数组的第一个元素的指针.

  • @ElchononEdelson:不是我知道的.comp.std.c上的[此帖子](https://groups.google.com/forum/message/raw?msg=comp.std.c/v5hsWOu5vSw/zHU1sw7_2mIJ)提供了一些信息. (3认同)
  • 你引用的是N1570草案.已发布的C11标准删除了对`_Alignof`的引用,因为无论出于何种原因,`_Alignof`只能应用于带括号的类型名称,而不能应用于表达式. (2认同)

Joh*_*ode 9

可以在此处找到此行为的历史原因.

C源自一个名为B的早期语言(go figure).B是无类型语言,内存被视为"单元格"的线性数组,基本上是无符号整数.

在B中,当您声明一个N元素数组时,如

auto a[10];
Run Code Online (Sandbox Code Playgroud)

为该阵列分配N个单元,并留出另一个单元来存储与该变量绑定的第一个元素的地址a.与在C中一样,数组索引通过指针算法完成:

a[j] == *(a+j)
Run Code Online (Sandbox Code Playgroud)

在Ritchie开始向C语言添加结构类型之前,这一点非常有效.他在文中给出的示例是一个假设的文件系统条目,它是一个节点id后跟一个名称:

struct {
  int inumber;
  char name[14];
};
Run Code Online (Sandbox Code Playgroud)

他希望struct类型的内容与磁盘上的数据相匹配; 一个整数的2个字节,紧接着是14个字节的名称.没有把指针存放到数组的第一个元素的好地方.

所以他摆脱了它.他没有为指针留出存储空间,而是设计了语言,以便从数组表达式本身计算指针值.

顺便说一下,这就是为什么数组表达式不能作为赋值的目标; 它与写作实际上是一样的3 = 4;- 你试图将值分配给另一个值.