C中的数组数据类型

Sam*_*Sam 23 c arrays pointers

通过阅读有关CI中指针和数组的一些细节,有点困惑.一方面,数组可以看作数据类型.另一方面,阵列往往是不可修改的左值.我想编译器会做一些事情,比如用常量地址替换数组的标识符,以及用于计算索引在运行时给出的位置的表达式.

myArray[3] -(compiler)-> AE8349F + 3 * sizeof(<type>)
Run Code Online (Sandbox Code Playgroud)

当说数组是数据类型时,这究竟意味着什么?我希望你能帮助我澄清我对数组实际是什么以及编译器如何处理它的困惑.

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.内存中没有任何内容实际存储数组中第一个元素的地址; 编译器只是在翻译阶段计算它.


这一切都取自"C语言的发展"一文


有关更多详细信息,您可能希望阅读此答案.


编辑:更清晰; 可修改的l值,不可修改的l值和r值之间的差异(简而言之);

这些表达方式的区别在于:

  • 修改的L值是可寻址的(可以是一元的&的操作数)和分配(可以=的左操作数).
  • 不可修改的L值是可寻址的,但不可转让.
  • r值既不是可寻址的,也不分配.