hac*_*cks 16
当谈到数组是一种数据类型时,这究竟意味着什么?
数据类型是具有具有预定义特征的值的一组数据.数据类型的示例有:整数,浮点单元号,字符,字符串和指针
数组是一组内存位置,它们都具有相同的名称和相同的类型.
如果你想知道为什么数组不可修改,那么我读过的最好的解释是;
C并没有完全由Dennis Ritchie的思想形成; 它源于早期的B语言(源自BCPL).1 B是一种"无类型"语言; 它没有用于整数,浮点数,文本,记录等的不同类型.相反,一切都只是一个固定长度的单词或"单元格"(本质上是一个无符号整数).记忆被视为线性细胞阵列.在B中分配数组时,例如
auto V[10];
Run Code Online (Sandbox Code Playgroud)
编译器分配了11个单元; 阵列本身的10个连续单元格,以及绑定到包含第一个单元格位置的V的单元格:
+----+
V: | | -----+
+----+ |
... |
+----+ |
| | <----+
+----+
| |
+----+
| |
+----+
| |
+----+
...
Run Code Online (Sandbox Code Playgroud)
当Ritchie struct向C 添加类型时,他意识到这种安排给他带来了一些问题.例如,他想创建一个结构类型来表示文件或目录表中的条目:
struct {
int inumber;
char name[14];
};
Run Code Online (Sandbox Code Playgroud)
他希望结构不仅以抽象方式描述条目,而且还表示实际文件表条目中的位,这些位没有额外的单元格或单词来存储数组中第一个元素的位置.所以他摆脱了它 - 而不是留出一个单独的位置来存储第一个元素的地址,他写了C,这样在计算数组表达式时将计算第一个元素的地址.
这就是为什么你不能做的事情
int a[N], b[N];
a = b;
Run Code Online (Sandbox Code Playgroud)
因为这两个a并且在该上下文中b评估指针值 ; 它相当于写作3 = 4.内存中没有任何内容实际存储数组中第一个元素的地址; 编译器只是在翻译阶段计算它.
有关更多详细信息,您可能希望阅读此答案.
编辑:更清晰; 可修改的l值,不可修改的l值和r值之间的差异(简而言之);
这些表达方式的区别在于:
- 甲修改的L值是可寻址的(可以是一元的&的操作数)和分配(可以=的左操作数).
- 甲不可修改的L值是可寻址的,但不可转让.
- 的r值既不是可寻址的,也不分配.