
在C++中,使用指针操作二维数组需要理解数组与指针的关系。二维数组本质上是一维数组的连续存储,可以通过指针以不同方式访问元素。
理解二维数组的内存布局
声明一个二维数组如 int arr[3][4],它在内存中是按行连续存放的。总共有 3×4=12 个整数,依次排列。这意味着可以用一个指向首元素的指针来遍历整个数组。
二维数组名 arr 的类型是 int (*)[4],即指向包含4个整数的一维数组的指针。不能直接赋值给 int* 类型,但可以用来计算地址。
用指针访问二维数组元素
有几种常见方式通过指针操作二维数组:
立即学习“C++免费学习笔记(深入)”;
-
方式一:使用数组名 + 偏移
例如 *(*(arr + i) + j) 等价于 arr[i][j]。这里 arr + i 指向第 i 行,*(arr + i) 是第 i 行首元素地址,再加 j 并解引用得到元素。 -
方式二:转换为一维指针访问
将二维数组视为一维结构:((int*)arr)[i * COLS + j],其中 COLS 是列数。这种方式利用了内存的连续性。 -
方式三:使用指针变量逐行操作
定义 int (*p)[4] = arr;,然后用 p[i][j] 直接访问,编译器会正确计算偏移。
动态分配二维数组并用指针操作
对于动态创建的二维数组,常见做法是使用指针的指针:
- 先分配行指针:int** arr = new int*[rows];
- 每行分配空间:for(int i = 0; i
- 此时可用 arr[i][j] 或 *(*(arr + i) + j) 访问元素
- 记得释放时先释放每行,再释放行指针数组
另一种更高效的方式是分配一块连续内存:int* arr = new int[rows * cols];,然后通过 arr[i * cols + j] 访问,类似二维转一维映射。
基本上就这些。关键是理解二维数组的内存模型和指针算术。只要地址计算正确,就能准确访问任意元素。不复杂但容易忽略细节,比如类型匹配和内存释放顺序。










