如何在C++中创建指向二维数组的指针数组?
创建指向特定维度二维数组的指针数组
要创建存储int (*ptr)[n]这类指针的数组,核心是明确数组元素的类型是“指向含n个int的一维数组的指针”,注意括号优先级(避免和普通的int指针数组int *ptr[n]混淆),具体写法和示例如下:
基础声明写法
直接声明指针数组的语法格式:
int (*ptr_arr[N])[n];
其中:
N是指针数组的元素总数(你需要存储的这类指针的数量)n是目标二维数组的列数(即原指针指向的一维数组的长度)
代码示例
比如创建一个能存储2个指向int[3]的指针的数组,并完成赋值与访问:
#include <iostream> int main() { // 两个3x3的二维数组作为目标 int Arr1[3][3] = {{1,2,3}, {4,5,6}, {7,8,9}}; int Arr2[3][3] = {{10,11,12}, {13,14,15}, {16,17,18}}; // 声明指针数组:包含2个元素,每个元素都是指向int[3]的指针 int (*ptr_arr[2])[3]; // 给指针数组元素赋值,指向两个二维数组的首行 ptr_arr[0] = Arr1; ptr_arr[1] = Arr2; // 测试访问:输出Arr1[0][0]和Arr2[1][1] std::cout << (*ptr_arr[0])[0] << std::endl; // 输出1 std::cout << ptr_arr[1][1][1] << std::endl; // 输出14 return 0; }
注:ptr_arr[i][j][k]等价于(*(ptr_arr[i] + j))[k],因为指向数组的指针支持偏移运算,所以可以简化多维元素的访问写法。
简化写法(类型别名)
如果觉得直接声明的语法过于繁琐,可通过typedef或C++11的using定义类型别名,提升代码可读性:
用typedef
// 定义类型别名:Arr3Ptr 代表“指向含3个int的一维数组的指针” typedef int (*Arr3Ptr)[3]; // 声明指针数组:2个元素,每个元素类型为Arr3Ptr Arr3Ptr ptr_arr[2];
用using(C++11及以后)
// 更直观的类型别名写法 using Arr3Ptr = int (*)[3]; Arr3Ptr ptr_arr[2];
注意事项
- 类型必须严格匹配:不能将指向
int[4]的指针赋值给Arr3Ptr类型的变量,数组长度是类型的一部分,编译器会做严格的类型检查。 - 二维数组名可直接赋值:二维数组名会自动退化为指向其首行(一维数组)的指针,和我们定义的指针类型完全兼容。
内容的提问来源于stack exchange,提问作者Mattia Suffredini
相关产品推荐
相关产品推荐

