最近碰到一个c++创建动态二维数组的问题。上网查了查资料,现在吧有关内容做一个小结。
关于二维数组,有几个容易混淆的概念。
int ** arr0;
int *arr1[];
int (*arr2)[];
int arr3[][];
int * *arr0 是一个二级指针,就是指针的指针。int *arr1[]是一个指针数组,就是说,它首先是一个数组 ,而数组中的元素都是 int 型的指针。int (*arr2)[] 是一个数组指针, 它首先是一个指针, 不过该指针指向的是一个数组,这点可以类比于函数指针。 int arr3[][]是一个二维数组, 实际上是数组的数组,它有外层数组,二外层数组里的每一个元素都是(内层的)数组。实际上,二维数组int arr3[][]与 数组指针 int (*arr2)[]可以对应起来,假如函数形参是int arr3[][] ,实参为 int(*arr2)[]的话是可以调用成功的,这就像有一个这样的函数签名:void print(int arr[] ,int size)
你这样
int a[]={1,2,3};
int *p =a;
print(p ,3);
是没有问题的。
下面说说如何创建动态二维数组,在c++中使用一对运算符 new 和delete来处理动态数组的创建。我在这里按照使用new的次数分为两种方法。
1.使用一次new运算符:
int size =3;
float (*arr)[2]= new float[size][2]; //二维数组分配内存
for(int i=0;i<size;++i) //对二维数组的初始化操作
{
for(int j =0;j<2;++j)
{
arr[i][j] = 0;
}
}
delete[] arr; //销毁内存
arr=NULL;
在这里定义了一个3x2 的二维数组 ,要注意如果用这种方式有个限制,即二维数组的列数必须指定,否则编译会报错。
2.使用两次new运算符:
int xsize = 4,ysize =5;
int **arr = new int*[xsize]; //为二维数组分配内存(外层)
int i,j;
for(i =0;i<xsize;++i)
{
arr[i]= new int[ysize]; //为二维数组分配内存(内层)
}
for(i=0;i<xsize;++i) //初始化
{
for(j=0;j<ysize;++j)
{
arr[i][j]=0;
}
}
for(i =0;i<xsize;++i) //销毁内存
{
delete[] arr[i];
arr[i]=NULL:
}
delete[] arr;
arr=NULL:
上面定义了一个4x5 的二维数组。可以看到,在分配内存时时使用了两次new,那么在销毁内存时也要使用两次delete。
可以看到两种方法操作二维数组元素的方式是一样的。