3.8.1 基本原则
3.8.1 基本原则
对于数据类型 T 和整型常数 N,声明如下:
T A[N];起始位置表示为 xA。这个声明有两个效果。首先,它在内存中分配一个 L · N 字节的连续区域,这里 L 是数据类型 T 的大小(单位为字节)。其次,它引入了标识符 A,可以用 A 来作为指向数组开头的指针,这个指针的值就是 xA。可以用 0~N-1 的整数索引来访问该数组元素。数组元素 i 会被存放在地址为 xA + L · i 的地方。
作为示例,让我们来看看下面这样的声明:
char A[12];
char *B[8];
int C[6];
double *D[5];这些声明会产生带下列参数的数组:
| 数组 | 元素大小 | 总的大小 | 起始地址 | 元素 i |
|---|---|---|---|---|
| A | 1 | 12 | xA | xA + i |
| B | 8 | 64 | xB | xB + 8i |
| C | 4 | 24 | xC | xC + 4i |
| D | 8 | 40 | xD | xD + 8i |
数组 A 由 12 个单字节(char)元素组成。数组 C 由 6 个整数组成,每个需要 8 个字节。B 和 D 都是指针数组,因此每个数组元素都是 8 个字节。
x86-64 的内存引用指令可以用来简化数组访问。例如,假设 E 是一个 int 型的数组,而我们想计算 E[i],在此,E 的地址存放在寄存器 %rdx 中,而 i 存放在寄存器 %rcx 中。然后,指令
movl (%rdx,%rcx,4),%eax会执行地址计算 xE + 4i,读这个内存位置的值,并将结果存放到寄存器 %eax 中。允许的伸缩因子 1、2、4 和 8 覆盖了所有基本简单数据类型的大小。
练习题 3.36 考虑下面的声明:
short S[7];
short *T[3];
short **U[6];
int V[8];
double *W[4];填写下表,描述每个数组的元素大小、整个数组的大小以及元素 i 的地址:
| 数组 | 元素大小 | 整个数组的大小 | 起始地址 | 元素 i |
|---|---|---|---|---|
| S | xS | |||
| T | xT | |||
| U | xU | |||
| V | xV | |||
| W | xW |