Array Storage
数组存储
数组是由相同类型的数据元素构成的有限序列。数组元素大小相同,并且在内存中连续存放,所以可以用起始地址和下标直接计算任意元素的地址。
一维数组
设一维数组 A[0...n-1] 的起始地址为 LOC,每个元素占 sizeof(ElemType) 个字节,则:
$$
LOC(A[i]) = LOC + i \times sizeof(ElemType)
$$
若题目没有特别说明,C 语言数组下标从 0 开始;矩阵题中的行号、列号常从 1 开始。做地址映射题时,先看清下标起点。
二维数组
二维数组本质上仍然存入一维连续内存,关键是确定存储顺序。
设二维数组 b[M][N],每个元素占 d 个字节,下标从 0 开始。
按行优先存储:
$$
LOC(b[i][j]) = LOC + (i \times N + j) \times d
$$
按列优先存储:
$$
LOC(b[i][j]) = LOC + (j \times M + i) \times d
$$
解题要点
地址计算题的核心是“目标元素前面已经存了多少个元素”。
- 行优先:先数完整的前
i行,再数当前行前j个元素。 - 列优先:先数完整的前
j列,再数当前列前i个元素。 - 若题目用
1起始下标,先把行列号换成偏移量,或直接使用对应的1起始公式。
常见易错点
- 不要把矩阵的数学下标和 C 数组下标混用。
M是行数,N是列数;行优先公式中一整行有N个元素。- “连续存储”意味着随机访问地址可直接计算,但插入、删除整行或整列不一定方便。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Elian's blog page!