2026-07-22 17:08:14
用指针访问多维数组元素需理解内存布局为线性连续存储,并通过指针类型匹配或手动偏移计算实现访问。
一、多维数组的内存布局线性存储:C语言中多维数组在内存中按行优先顺序连续存储。例如:
int arr[3][4]; // 分配12个连续int空间存储顺序为:
第1行:arr[0][0], arr[0][1], arr[0][2], arr[0][3]
第2行:arr[1][0], ..., arr[1][3]
第3行:arr[2][0], ..., arr[2][3]

关键特性:
编译器通过维度信息分组,但实际内存是一维连续的。
可用一级指针遍历所有元素。
示例:访问 arr[1][2]:*(p + 1 * 4 + 2); // 列数为4
其他元素对应关系:
arr[0][0] → *(p + 0)
arr[1][0] → *(p + 4)
arr[2][3] → *(p + 11)
示例:p[1][2]; // 等价于 arr[1][2]
优势:无需手动计算偏移,代码更清晰。
忘记乘以列数:
错误写法:*(p + i + j)(未考虑行内偏移)。
正确写法:*(p + i * 列数 + j)。
误用指针类型:
错误示例:用 int * 接收二维数组名 arr 后直接按二维访问。
正确做法:根据需求选择一级指针(手动偏移)或指向数组的指针(自动偏移)。
混淆 arr 与 &arr:
arr:指向首元素(&arr[0]),类型为 int (*)[4]。
&arr:指向整个数组,类型为 int (*)[3][4]。
区别:步长不同,arr + 1 移动一行,&arr + 1 移动整个数组。
多维数组内存为线性连续,按行优先存储。
一级指针需手动计算偏移(i * 列数 + j)。
指向数组的指针(如 int (*)[4])可简化二维访问。
理解内存布局是基础。
根据场景选择指针类型,避免类型不匹配导致的错误。
注意 arr 与 &arr 的类型和步长差异。
通过掌握内存布局和指针运算规则,可以高效且安全地用指针访问多维数组元素。