在C语言中定义动态数组

Author: Date: 1995-12-29

        对于这类问题,一般的解决方法是根据实际问题确定元素个数的动态范围,定义尽可能大的数组。例如数组元素为一个班级的学生人数,可以定义有100个元素的数组。这种方法有两个缺点:1.当实际元素个数较少(例如一个班级只有40个学生)时浪费内存;2.一旦实际元素个数超过了所定义的范围(例如有101个学生),程序将不能正确执行。
        利用指针变量可以很好地解决这个问题。在C语言中,一维数组名实质上是指向数据的指针,二维数组名是指向指针的指针,三维数组名是指向指针的指针的指针,依次类推。因此,定义一个指针变量,为它分配适当大小的内存,即可以把它当数组名来用。因为分配内存是在程序执行时完成的,所以,为指针变量分配大小不等的内存,即相当于定义了元素个数可变的数组。举例如下:
        输入一个m行n列的矩阵,把它绕中心旋转180度打印出来。源程序为:
        #include<alloc.h> /*用于分配内存*/
        #include<stdio.h>/*用于输入输出*/
        main(){
        int m,n; /*矩阵的行和列,执行时才知大小*/
        int **a; /*指向int的指针的指针,相当于二维数组*/
        int i,j; /*循环变量*/
        scanf("%d%d",&m,&n); /*输入m,n*/
        a=malloc(sizeof(int)*m*n); /*为a分配内存,大小为m*n个int元素*/
        for (i=o;i<m;i++)
        for (j=0;j<n;j++)
        scanf("%d",&a[i][j]); /*输入矩阵元素*/
        putchar('\n')   /*输入和输出之间空一行*/
        for (i=m-1;i>=0;i--){ /*从最后一行到第一行*/
        for (j=n-1;j>=0;j--)  /*从最后一列到第一列*/
        printf("%d",a[i][j]); /*打印矩阵元素*/
        putchar('\n') /*换行*/
        }
        }