2.1 KiB
2.1 KiB
L08 Data
多个数据元素放到一起的情况
目录
- Arrays 数组
- Structures 结构体
- Floating Point 浮点数
Arrays 数组
数组分配的基本思想相当简单: 在内存中分配一块儿连续的空间存储元素。
T array[L]
- 一个数据类型为T的数组,包含L个元素
- 在内存中占用连续的
L * sizeof(T)字节的空间 - 数组名
array可以被转换为指向数组元素0的指针 (Type T *) -
- 是C语言特殊的原因之一1
Array Access in C C语言中的数组访问
前面的章节已经提到了(A, B, x)这样子的寄存器寻址表示方式。它简直就是为数组访问而生的 -- 看看下面的代码:
typedef int int_arr[5];
int get_num(int_arr arr, int index) {
return arr[index];
}
get_num: # 函数参数: arr -> %rdi, index -> %esi
movslq %esi, %rsi # 将index转换为64位
movl (%rdi,%rsi,4), %eax # 从 (%rdi) + 4 * %rsi 加载元素到eax
ret
(%rdi, %rsi, 4) 是一个寄存器寻址模式。参考注释,可以发现它就是指向了arr[index]的地址。
很显然,Intel格式的汇编语句也会有这种常见操作。
get_num: # 这是Debug配置下的编译结果,因此略显冗长
movsxd rax,dword ptr [index] # 将index转换为64位
mov rcx,qword ptr [arr] # 将arr的地址加载到rcx
mov eax,dword ptr [rcx+rax*4] # 从 (rcx) + 4 * rax 加载元素到eax
ret
Multidimensional Arrays 多维数组
-
C 语言中的数组解引用运算符 [ ] 是用指针定义的
x[y]的意思是:从指针x开始,向前移动y个元素,然后取下那里的所有元素。使用指针运算语法,x[y]也可以写成*(x+y)。有一个例外情况: 计算sizeof(array)时,返回一个指针的占用字节数没卵用。因此,在这里,数组名array不会被转换为指针,而是返回整个数组占用的字节数。 ↩︎