二维数组的分配以及数组指针数组
C语言提供类似于矩阵的多维数组,在一些进行数学运算的程序中会经常用到。从形式 上看多维数组是由多个一维数组组成的,但C语言处理多维数组的方法和一维数组一样,都是线性存储,连续分配存储空间,可以用带偏移量(offset)的一 维数组来访问多维数组。而在数组规模不确定的情况下,就需要用malloc函数动态分配存储空间。这里的数组规模不确定指的是数组的维数确定,而每一维的 元素个数是不确定的。例如根据用户输入的行数和列数来确定一个二维数组。
下面使用两种方式来进行二维数组分配:
对应的代码如下:
#include <stdio.h>
#include <stdlib.h>
#define mem_alloc(type,len) (type*)malloc(len*sizeof(type))
void test(int **arr,int row,int col)
{
int i,j;
for(i=0;i<row;i++){
for(j=0;j<col;j++) {
arr[i][j]=i;
printf("%3d",arr[i][j]);
}
printf("\n");
}
}
void method1(int row,int col)
{
int **arr;
int i;
arr=mem_alloc(int*,row);
for(i=0;i<row;i++)
arr[i]=mem_alloc(int,col);
test(arr,row,col);
for(i=0;i<row;i++)
free(arr[i]);
free(arr);
}
void method2(int row,int col)
{
int **arr;
int i;
int *elem;
arr=mem_alloc(int*,row);
elem=mem_alloc(int,row*col);
for(i=0;i<row;i++)
arr[i]=&elem[i*col];
test(arr,row,col);
free(elem);
free(arr);
}
int main()
{
int row=5;
int col=7;
method1(row,col);
method2(row,col);
}
#include <stdlib.h>
#define mem_alloc(type,len) (type*)malloc(len*sizeof(type))
void test(int **arr,int row,int col)
{
int i,j;
for(i=0;i<row;i++){
for(j=0;j<col;j++) {
arr[i][j]=i;
printf("%3d",arr[i][j]);
}
printf("\n");
}
}
void method1(int row,int col)
{
int **arr;
int i;
arr=mem_alloc(int*,row);
for(i=0;i<row;i++)
arr[i]=mem_alloc(int,col);
test(arr,row,col);
for(i=0;i<row;i++)
free(arr[i]);
free(arr);
}
void method2(int row,int col)
{
int **arr;
int i;
int *elem;
arr=mem_alloc(int*,row);
elem=mem_alloc(int,row*col);
for(i=0;i<row;i++)
arr[i]=&elem[i*col];
test(arr,row,col);
free(elem);
free(arr);
}
int main()
{
int row=5;
int col=7;
method1(row,col);
method2(row,col);
}
方法1的好处是程序简单,容易理解,它首先对指向每一行的指针分配存储空间,然后将该指针指向列元素指针。注意最后要先后释放(free) array[n]和array。
方法2的优点是可以对变长二维数组分配空间。一般情况下矩阵的行数容易得到,而每一行的元素个数可能不同(稀疏矩阵),方发2中element 是指向所有元素的指针,可处理变长的column。上面的两种方式是数组的两维的大小都是可以给定的。 如果数组其中一维大小给定时,我们可以采用数组指针的方式来实现。
比如数组的第二维大小为3,如果要分配4x3大小的数组,可以采用下面的方式:
int (*a3)[3]=new int[4][3];
这种方式不太好理解,可以利用typedef:
typedef int Arr[3];//定义一个大小为3的数组类型
Arr* a3=new Arr[4];
如果是用C语言的话可以采用下面的方式:
Arr* a3=(Arr*)malloc(sizeof(Arr)*4);
a3就是一个指针数组。
下面的实现也是合法的:
typedef int (*Parr)[3];
Parr a3=(Parr)malloc(sizeof(Parr)*4);
这儿就涉及到一个问题,在int (*a3)[3]=new int[4][3];
中, a3是一个数组指针,也可以理解为数组指针数组。
释放空间的时候,下面两种方式都是可以的。
delete[] a3;
delete[] (*a3);
参考:http://xifage.com/malloc-multi-dim-array/