方法一:利用二级指针申请一个二维数组。
#include<stdio.h>
#include<stdlib.h>
int main()
{
int **a; //用二级指针动态申请二维数组
int i,j;
int m,n;
printf("请输入行数
");
scanf("%d",&m);
printf("请输入列数
");
scanf("%d",&n);
a=(int**)malloc(sizeof(int*)*m);
for(i=0;i<m;i++)
a[i]=(int*)malloc(sizeof(int)*n);
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
printf("%p
",&a[i][j]); //输出每个元素地址,每行的列与列之间的地址时连续的,行与行之间的地址不连续
}
}
for(i=0;i<m;i++)
free(a[i]);
free(a);
return 0;
}
方法二:用数组指针形式申请一个二维数组。
#include<stdio.h>
#include<stdlib.h>
int main()
{
int i,j;
//申请一个3行2列的整型数组
int (*a)[2]=(int(*)[2])malloc(sizeof(int)*3*2);
for(i=0;i<3;i++)
{
for(j=0;j<2;j++)
{
printf("%p
",&a[i][j]); //输出数组每个元素地址,每个元素的地址是连续的
}
}
free(a);
return 0;
}
方法三:用一个单独的一维数组来模拟二维数组。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int nrows,ncolumns;
int *Array;
int i,j;
printf("please input nrows&ncolumns:
");
scanf("%d%d",&nrows,&ncolumns);
Array=(int *)malloc(nrows*ncolumns*sizeof(int)); //申请内存空间
for(i=0;i<nrows;i++)
{
for(j=0;j<ncolumns;j++)
{
Array[i*ncolumns+j]=1;
printf("%d ",Array[i*ncolumns+j]); //用Array[i*ncolumns+j] 访问第i,j个成员
}
printf("
");
}
free(Array);
return 0;
}
两种方法:
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;