首先,我们拿最基本的C语言实现二维数组的动态开辟与释放,主要用到malloc、free函数
1.最基本的c语言实现
#include<stdio.h>
#include<assert.h>
#include<malloc.h>
#define ROW 4
#define LOW 5
void main()
{
int **p = (int**)malloc(sizeof(int*)*ROW);
int i,j;
assert(p != NULL);
for(i = 0;i < ROW;++i)
{
p[i] = (int*)malloc(sizeof(int)*LOW);
assert(p[i] != NULL);
}
for(i = 0;i<ROW;++i)
{
for(j = 0;j < LOW;++j)
{
p[i][j] = i + j;
}
}
for(i = 0;i<ROW;++i)
{
for(j = 0;j < LOW;++j)
{
printf("%d ",p[i][j]) ;
}
printf("\n");
}
for(i = 0;i<ROW;++i)
{
free(p[i]);
}
free(p);
}
.循序渐进,我们将上面的代码进行简单的封装
#include<stdio.h>
#include<assert.h>
#include<malloc.h>
#define Type int
#define ROW 4
#define LOW 5
Type** _Malloc(int row,int low)
{
Type **p = (Type**)malloc(sizeof(Type*)*row);
assert(p != NULL);
for(int i = 0;i < row;++i)
{
p[i] = (Type*)malloc(sizeof(Type)*low);
assert(p[i] != NULL);
}
return p;
}
void _Assign(Type **p,int row,int low)
{
for(int i = 0;i<row;++i)
{
for(int j = 0;j < low;++j)
{
p[i][j] = i + j;
}
}
}
void _Show(Type **p,int row,int low)
{
for(int i = 0;i<row;++i)
{
for(int j = 0;j < low;++j)
{
printf("%d ",p[i][j]) ;
}
printf("\n");
}
}
void _Free(Type **p,int row)
{
for(int i = 0;i<row;++i)
{
free(p[i]);
}
free(p);
}
void main()
{
Type **p = _Malloc(ROW,LOW);
_Assign(p,ROW,LOW);
_Show(p,ROW,LOW);
_Free(p,ROW);
}
2.用C++语言来实现,主要用到的是new、delete操作符
#include<iostream>
using namespace std;
#define Type int
#define ROW 4
#define LOW 5
typedef Type(*Arr)[LOW]; //指向数组一行的指针
Arr _New()
{
Arr p = new Type[ROW][LOW];
return p;
}
void _Assign(Arr p)
{
for(int i = 0;i<ROW;++i)
{
for(int j = 0;j < LOW;++j)
{
p[i][j] = i + j;
}
}
}
void _Show(Arr p)
{
for(int i = 0;i<ROW;++i)
{
for(int j = 0;j < LOW;++j)
{
cout<<p[i][j]<<" ";
}
cout<<endl;
}
}
void _Delete(Arr p)
{
delete []p; //注意申请的是数组指针
}
void main()
{
Arr p = _New();
_Assign(p);
_Show(p);
_Delete(p);
}
3.用C++语言来实现三维数组的动态开辟与释放,主要用到的是new、delete操作符
#include<iostream>
using namespace std;
#define Type int
#define ROW 4
#define LOW 5
#define Hig 3
typedef Type(*Arr)[ROW][LOW]; //指向二维数组的指针
Arr _New()
{
Arr p = new Type[Hig][ROW][LOW];//Arr p = new Type[ROW][LOW][Hig] Error
return p;
}
void _Assign(Arr p)
{
for(int k = 0;k < Hig;++k)
{
for(int i = 0;i<ROW;++i)
{
for(int j = 0;j < LOW;++j)
{
p[k][i][j] = i + j + k;
}
}
}
}
void _Show(Arr p)
{
for(int k = 0;k < Hig;++k)
{
for(int i = 0;i<ROW;++i)
{
for(int j = 0;j < LOW;++j)
{
cout<<p[k][i][j]<<" ";
}
}
cout<<endl;
}
}
void _Delete(Arr p)
{
delete []p; //注意申请的是数组指针
}
void main()
{
Arr p = _New();
_Assign(p);
_Show(p);
_Delete(p);
}
从以上代码中我们可以总结出一个简单的规律:为简便起见,N维数组就的创建可以通过N-1维数组指针来接收