总是这样,我的意思是,数组名称总是指向数组的第一个元素的指针.为什么它是这样的呢?它是实现有点事物还是语言特征?
Car*_*rum 16
数组名称本身不是指针,但在大多数上下文中衰减为指向数组的第一个元素的指针.就是这样,因为语言就是这样定义的.
从C11 6.3.2.1左值,数组和函数指示符,第3段:
除非它是运算
sizeof符,_Alignof运算符或一元运算&符的操作数,或者是用于初始化数组的字符串文字,否则将类型为"数组类型 "的表达式转换为类型为"指向类型的指针"的表达式"它指向数组对象的初始元素,而不是左值.
您可以从comp.lang.c FAQ的Arrays and Pointers部分了解有关此主题的更多信息(以及涉及的微妙行为).
编辑抛开:同样的行为发生在C++中,尽管语言指定它有点不同.作为参考,我在这里有一个C++ 11草案,4.2数组到指针的转换,第1段:
"数组
NT"或"未知范围的数组" 类型的左值或右值T可以转换为"指向T" 的类型的右值.结果是指向数组的第一个元素的指针.
可以在此处找到此行为的历史原因.
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;- 你试图将值分配给另一个值.