地址连续的二维数组在C语言数值计算中有重要意义,很多二维数组的算法是基于一维数组写的。另外,在序列化时或内存复制时,连续空间易于进行整块内存的操作。
子程序说明:
1- Array2D和FreeArray2D可实现地址连续的动态二维数组的地址分配和释放。
2- 作为对照,给出了地址不连续的二维数组地址分配与释放的子程序。
// 创建 n X m 的动态数组,该数组的元素地址在内存中是连续的
// n - 输入参数,数组的行数
// m - 输入参数,数组的列数
// 返回,double **,指向指针的指针,用于以二维数组的方式访问一段内存。
double **Array2D(int n,int m)
{
// 建立数组的存储区,即在内存中分配一片连续的空间,元素个数为 n*m,
// 返回指向double的指针。
double *Array1D=new double[n*m];
// 建立数组的索引区,返回指向 double *的指针(指向指针的指针),长度为 n。
double **Array2D=new double* [n];
// 将索引区的每个元素指向数据存储区对应元素的地址,Array2D[0] 指向 Array1D[0],
// Array2D[1] 指向 Array1D[m],其余类推。
for(int i=0;i<n;i++)
{
Array2D[i]=&Array1D[i*m];
}
return Array2D;
}
// 释放数组的空间,首先释放一维数组占用的n*m个double空间
// 再释放索引数组(指针数组)占用的n个double*空间
void FreeArray2D(double **Array2D)
{
delete[] Array2D[0];
delete[] Array2D;
}
// 二维数组空间分配,地址一般不连续,不是推荐的方法
double **Array2D_A(int n,int m)
{
// 建立数组的索引区,返回指向 double *的指针(指向指针的指针),长度为 n。
double **Array2D=new double* [n];
// 建立数组的存储区,对于Array2D的每一个指针元素,分配m个double空间
for(int i=0;i<n;i++)
Array2D[i]=new double[m];
return Array2D;
}
// 释放数组的空间,与Array2D_A配套使用
// 首先释放n个一维数组(每个占用m个double空间)
// 再释放索引数组(指针数组)占用的n个double*空间
void FreeArray2D_A(double **Array2D,int n)
{
for(int i=0;i<n;i++)
delete[] Array2D[i];
delete[] Array2D;
}