方法一:使用常量
接上:如果将b(即列数)指定为一个常量,例如new int[a][3],其实质与new int[a]创建一个动态数组并无多大区别——只是元素类型由int变为了’int[3]'而已。
示例代码:
用这个方法来创建二维数组,比较直观、易用,但它最大的限制在于:你必须在编译时确定b的大小;
int main(void)
{
int n = 2;
int(*array_2D)[3] = new int[n][3];//array_2D是行指针!!!
for (int i = 0; i < n; ++i)
{
for (int j = 0; j < 3; ++j)
{
array_2D[i][j] = i * j;
}
}
// 回收方法和普通动态数组相同,使用'delete[]'即可
delete[] array_2D;
system("pause");
return 0;
}
注意内存连续,类似array_2D[i*cols+j]这样的操作可以用。
下图可以看出其实二维数组的数组名就是一个行指针!
方法二:使用指针间接引用
首先创建若干个大小一致的动态数组,然后将这些数组的首地址(转化为指针)按顺序存储到一个动态数组中,就相当于模拟了一个二维动态数组。
示例代码:
#include<iostream>
using namespace std;
int main(void) {
int rows = 3, cols = 3;
//数组中的元素(即array_2D[i])类型为'int*',动态内存分配返回的是首元素的地址,故使用'int**'
int **array_2D = new int*[rows];
for (int i = 0; i < rows; i++)
//数组中的元素(即array_2D[i][j])类型为'int',动态内存分配返回的是首元素的地址,故使用'int*'
array_2D[i] = new int[cols];
for (int i = 0; i < rows; i++)
for (int j = 0; j < cols; j++)
array_2D[i][j] = i*j;//注意内存非连续,类似array_2D[i*cols+j]这样的操作不可用,会造成数组越界
//释放内存时,首先回收低一级的动态内存
for (int i = 0; i < rows; i++)
delete[] array_2D[i];
//然后回收高一级的动态内存
delete[] array_2D;
system("pause");
return 0;
}
注意内存非连续,类似array_2D[i*cols+j]这样的操作不可用,会造成数组越界(下图很清晰地可以通过地址看出)。