今天在群里遇到一个询问二维数组动态申请的问题,自己想了一种办法,又在网上搜了一下,觉得下面这篇文章写得不错,特转帖如下:
两种方法:
1。先定义一个一维数组的类型,然后再用该类型定义一个一维数组(实际上已经成为二维的)
相当于递归定义
typedef int array[COL]; //使用typedef定义一个具有COL个元素的数组类型
array *a; //定义二维数组,与一维数组相同
a=new array[row]; //为该一维数组(实际上二维)申请空间
该方法定义的动态二维数组的释放只需以下语句即可:
delete[] a;
a=NULL;
2。 使用数组指针,分配一个指针数组,将其首地址保存在b中,然后再为指针数组的每个元素分配一个数组
int **b=new int*[row]; //分配一个指针数组,将其首地址保存在b中
for(i=0;i<row;i++) //为指针数组的每个元素分配一个数组
b[i]=new int[col];
该方法定义的动态二维数组的释放需先释放指针数组的每个元素指向的数组,然后再释放该指针数组:
for(i=0;i<row;i++)
{
delete [col]b[i];
b[i]=NULL;
}
delete [row]b;
b=NULL;
3. int *mat = new int[m * n];
这种方法的优点是内存连续,存续速度快。并且释放时也很简单直接delete[]mat;即可。
#include <iostream>
using namespace std;
void main(void)
{
int n = 3;
// 方法2
int **mat = new int*[n];
for (int i = 0; i < 3; i++)
{
mat[i] = new int[n];
}
// int *mat = new int[n * n]; // 方法3
// 赋值
for (int i = 0; i < 3; i++)
{
for (int k = 0; k < 3; k++)
{
mat[i][k] = i + k; // 方法2
//mat[i + k] = i + k; // 方法3
}
}
// 输出
for (int i = 0; i < 3; i++)
{
for (int k = 0; k < 3; k++)
{
cout<<mat[i][k]<<" "; // 方法2
// cout<<mat[i + k]<<" "; // 方法3
}
cout<<endl;
}
// 释放
// 方法2
for (int i = 0; i < 3; i++)
{
delete[] mat[i];
mat[i] = NULL;
}
delete[] mat;
mat = NULL;
// 方法3,很简单
// delete[] mat;
system("pause");
}