c++二维数组定义与初始化
int a[ ][ ]定义二维数组,静态申请
// 定义的二维数组如果不手动初始化的话,全局变量会被初始化为0,否则会随机初始化 int a[5]; // 定义一维数组 int a[2][3]; // 定义二维数组 // 手动初始化 // 指定每一列的值 int a[2][3] = { {1,2,3}, {4,5,6}, }; // 不指定行数,等价于上述初始化值 int a[][3] = { {1,2,3}, {4,5,6}, }; // 每行省略部分初始化为0 int a[2][3] = { {1}, // 等价于{1, 0, 0} {4,5,6}, }; // 从头开始初始化 int a[2][3] = {1,2,3,4,5,6}; // 初始化所有元素为0 int a[2][3] = {0}; // 不指定第一维 int a[][3] = {1,2,3,4,5,6}
注意:静态申请的二维数组如果是局部变量是在栈上,且占用连续的内存空间。 动态申请的二维数组使用new和malloc是在堆上,不同行之间不一定是连续的。
动态申请二维
/* 使用malloc */ int **a; 定义一个二级指针,表示a[m][n] a = (int **)malloc(m*sizeof(int *)); # 定义一个m列的指针数组 for (int i=0; i<m; i++) { a[i] = (int *)malloc(n*sizeof(int)); } // 释放 for (int i=0; i<m; i++) { free(a[i]); } free(a); /* 使用new */ int **a; a = new int *[m]; for (int i=0; i<m; i++){ a[i] = new int[n]; } // 释放 for (int i=0; i<m; i++) { delete a[i]; } delete a[i];
使用vector
int m = 2; int n = 3; vector<vector<int>> vec1(m, vector<int>(n)); // 初始化方法1, 默认初始化为0 vector<vector<int>> vec2 = vector<vector<int>>(m, vector<int>(n)); // 初始化方法2,默认初始化为0 vector<vector<int>> vec3 = vector<vector<int>>(m, vector<int>(n)) = { {1,2,3}, {4,5,6}};