二维数组的分配以及数组指针数组

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);
}

 

方法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/

 

 

 

 

posted @ 2012-05-14 11:01  Mr.Rico  阅读(1071)  评论(0编辑  收藏  举报