数组说明翻译
数组说明 → 填 符号表 + 建 内情向量表
- 符号表记录数组名、类型、内情向量表指针
- 内情向量表(dope vector)记录:维数、各维上下界、各维长度、元素类型宽度、数组首地址
示例:int arr[3][4] 的内情向量表
数组名: arr
首地址: A₀
元素宽度: 4 (sizeof int)
维数: 2
第1维: [0..2], 长度=3
第2维: [0..3], 长度=4
重点 数组说明涉及符号表和内情向量表两块内容。
数组元素引用翻译
翻译数组引用时需完成:
- 类型检查:元素类型与上下文要求一致
- 下标越界检查:生成运行时的越界检测代码
- 地址计算:根据存储方式计算偏移量
行优先 vs 列优先
- 行优先(Row-major):按行顺序存储,先存完一行再存下一行(C 语言)
- 列优先(Column-major):按列顺序存储,先存完一列再存下一列(Fortran)
对于数组 ,元素 :
- 行优先偏移:
- 列优先偏移:
N 维数组地址公式
重点 数组地址公式 必须掌握。
设数组 ,元素宽度为 ,下标从 开始简化:
行优先
可变部分 + 不变部分
- :含下标变量的项(如 )
- :含下界偏移的常数项
- 编译时计算 ,运行时计算
示例: 中 的地址(行优先,宽度 )
其中 ,。
动态数组
- 编译时:分配符号表 + 内情向量表空间,记录维数信息
- 运行时:根据实际维界计算数组体积,分配存储空间
动态数组的地址计算中, 等值为运行时确定,不可在编译时预先计算。