数组分配与访问
C 语言中的数组是一种将标量数据聚集成更大数据类型的方式。C 语言实现数组的方式非常简单,因此很容易翻译成机器代码。C 语言的一个不同寻常的特点是可以产生指向数组元素的指针,并对这些指针进行运算。在机器代码中,这些指针会被翻译成地址计算。
优化编译器非常善于简化数组索引所使用的地址计算。不过这使得 C 代码和它到机器代码的翻译之间的对应关系有些难以理解。
8.1 基本原则
C 语言允许对指针进行运算, 而计算出的值会根据该指针引用的数据类型的大小进行伸缩
- 如果 指针类型T, P 指向这个数组: p + i = xp + L * i,这里L是元素的大小。
- 历史上来说, C 语言只支持大小在编译时确定的多维数组:程序员如果需要变长数组的时候, 就需要 malloc 或者 calloc
8.2异质的数据结构
C 语言中提供了两种将不同类型的对象组合到一起创建数据类型的机构
- 结构 structure 使用 struct 声明:允许多个对象集合在一个单位中
8.2.1 结构
- 类似数组,将可能不同类型的对象聚集在一个连续的内存区域内
- 结构的所有组成部分都存放在内存中一段连续的空间
- 指向结构的指针就是结构第一个字节的地址
struct rec{
int i;
int j;
int a[2];
int *p;
}
8.2.2 数据对齐
- 要求某种类型对象的地址必须是某个值 K 的倍数
- 如果处理器需要从内存中取8 个字节, 那么地址必须是 8的倍数