一.先从用malloc()函数申请多维动态函数说起。
C语言中用普通的方式定义的数组其大小不能改变。如通过int a[N];定义大小为N的整型数组,其后N的改变不会再改变原来数组大小。但我们可以通过malloc()或calloc()等动态存储分配函数申请分配一块空间,将其返回的所分配单元的起始地址赋给指针,我们就可以利用得到的指针进行和数组一样的操作。因为我们知道普通的数组名其实就是数组的起始地址,相当于一个指针常量。
1.定义一个大小为n的整型动态数组,如下:
int *a;
int n;
n = 10; //此处设为10
a =(int *)malloc(sizeof(int)*n); /*动态分配存放10个整型的内存,将所分配空间起始地址转换为
整型地址赋给指针a*/
a[5] = 100; /*引用同一般数组,但不应超出所分配内存的大小
a[5]相当于*(a+5), 即从首地址向后跳过5个(整型)内存*/
free(a); //释放a所指的内存区
在知道地址和变量类型的情况下,a[i]等同于*(a+i),即从首地址开始跳过i个已知类型的数据元素。这两个内存函数原型为void *malloc(usigned size);和void *calloc(unsigned n, unsign size);它们包含在<stdlib.h>中。两者区别有二:一是前者分配size个字节大小的连续空间,后者分配n个size字节的连续空间。二是后者分配的内存初始化为0;而前者没有;如果想改变一个已分配地址的内存区的大小可以用函数void *realloc(void *p, unsign size)。这几个函数返回void 指针类型,赋值给其他类型指针时,需经过类型转换,系统一般在编译时也进行隐式转换。
2.定义一个三维动态数组大小为n1,n2,n3
想得到多维的的动态数组,可以嵌套使用前面的方法,如将得到的动态数组的元素a[i]再定义为动态数组。即定义指向指针的指针,由外向内逐级分配空间。
int ***a; //定义指针的指针的指针
int n1, n2, n3;
int i, j, k;
scanf("%d%d%d",&n1,&n2,&n3);
a=(int ***)malloc(n1*sizeof(int **)); /*a有n1个元素,每个元素仍为数组(其实是指针的指针)
a为数组首地址,a[1],a[2],...,a[n1]为其子数组元素首地址,以此类推直至得到元素*/
for(i=0; i<n1; i++)
{
a[i]=(int **)malloc(n2*sizeof(int *)); //a[i]有n2个元素,每个元素为一维数组的首地址(其实是指针)