zoukankan      html  css  js  c++  java
  • 《C语言中动态数组的创建及引用》

    C语言中动态数组的创建及引用

      动态数组是相对于静态数组而言的,静态数组的长度是预定义好的,在整个程序中,一旦给定了数组大小后就无法改变,
    ,而动态数组则不然,它可以根据程序需要重新指定数组的大小。动态数组的内存空间是由堆动态分配的,通过执行代码为其
    分配储存空间,只有程序执行到分配语句时,才为其分配储存空间。
      对于动态数组,其创建比静态数组更麻烦一些,使用完必须由程序员自己释放,否则将引起内存泄漏,但是其使用非常灵活,能根据程序需要动态分配大小,因此相对于静态数组来说,使用动态数组的自由度更大。

      对于动态数组的创建和引用我们尤其需要注意的便是它的创建原则。

      动态数组的创建原则从外层项里层创建,从里层向外层逐渐释放。

      下面通过代码实例来看看:

     一:一维动态数组
     创建一维动态数组的一般格式:
       类型说明符 * 数组名 = (类型说明符 * )malloc(数组长度 * sizeof(类型说明符));
     代码实例:

     1 #include<stdio.h>
     2 #include<stdlib.h>
     3 int main(void)
     4 {
     5     int n,i;
     6     int *arr;
     7     printf("请输入所要创建的一维动态数组的长度:");
     8     scanf("%d",&n);
     9     if((arr=(int *)malloc(n*sizeof(int)))==NULL)
    10     {
    11         printf("分配内存空间失败,程序退出!");
    12         return 0;
    13     }
    14     for(i=0;i<n;i++)  /*向申请成功的数组中赋值*/
    15     {
    16         arr[i]=i+1;
    17         printf("%d	",arr[i]);
    18         if(0==(i+1)%4)
    19             printf("
    ");  /*一行打印四个元素*/
    20     }
    21     free(arr);  /*切记!使用完后记得要释放所申请的空间*/
    22     return 0;
    23 }

    该代码的运行结果为:

     

    请输入所要创建的一维动态数组的长度:12
    1    2    3    4
    5    6    7    8
    9    10    11    12

    点评:程序先使用了malloc()函数向系统动态申请分配了sizeof(int)*n个字节的内存空间,然后将申请的内存空间视为一个
     一维数组进行操作,当然,一维数组的申请并没有体现动态数组的分配原则。请看下面的实例。

    二:二维动态数组
     创建二维动态数组的一般格式:
       类型说明符 ** 数组名 = (类型说明符 ** )malloc (第一维长度*sizeof(类型说明符 * ));
     例如:
     arr=(int **)malloc(n1*sizeof(int *));

     for(i=0;i<第一维长度;i++)
     {
      数组名[i] = (类型说明符 * )malloc(第二维长度*sizeof(类型说明符));
     }

    代码实例:

     1 #include<stdio.h>
     2 #include<stdlib.h>
     3 int main(void)
     4 {
     5     int n1,n2,i,j;
     6     int **arr;
     7     printf("请输入所要创建的动态数组的第一维长度:");
     8     scanf("%d",&n1);
     9     printf("请输入所要创建的动态数组的第二维长度:");
    10     scanf("%d",&n2);
    11     if((arr=(int **)malloc(n1*sizeof(int *)))==NULL)  /*第一维的创建*/
    12     {
    13         printf("分配内存空间失败,程序退出!");
    14         return 0;
    15     }
    16     for(i=0;i<n1;i++)  /*创建第二维*/
    17     {
    18         if((arr[i]=(int *)malloc(n2*sizeof(int)))==NULL)
    19         {
    20             printf("分配内存空间失败,程序退出!");
    21             return 0;
    22         }
    23     }
    24     for(i=0;i<n1;i++)
    25     {
    26         for(j=0;j<n2;j++)
    27         {
    28             arr[i][j]=i*n2+j+1;  /*为申请成功的数组中赋值*/
    29             printf("%d	",arr[i][j]);
    30         }
    31         printf("
    ");
    32     }
    33     for(i=0;i<n1;i++)
    34     {
    35         free(arr[i]);  /*先释放第二维*/
    36     }
    37     free(arr);  /*最后释放第一维*/
    38     return 0;
    39 }

    该代码的运行结果为:

    请输入所要创建的动态数组的第一维长度:4
    请输入所要创建的动态数组的第二维长度:3
    1    2    3
    4    5    6
    7    8    9
    10    11    12

    总结:对动态数组的使用要有始有终,要牢记使用完后要及时释放所申请的内存空间,避免造成内存泄漏。
     在创建和释放内存空间时要遵守原则:从外层向里层逐层创建,从里层向外层逐层释放。

    三:三维动态数组
      通过前面一维和二维动态数组的创建实例学习,相信大家已经可以准确推测出三维动态数组的一般创建格式了,
     没错,就是形如如下的形式:
     类型说明符 *** 数组名 = (类型说明符 *** )malloc(第一维长度*sizeof(类型说明符 **));
     例如:
     arr=(int ***)malloc(n1*sizeof(int **));
     for(i=0;i<第二维长度;i++)
     {
      数组名[i]=(类型说明符 **)malloc(第二维长度*sizeof(类型说明符 *));
      for(j=0;j<第三维长度;j++)
      {
       数组名[i][j]=(类型说明符 *)malloc(第三维长度*sizeof(类型说明符));
      }
     }

    代码实例:

     1 #include<stdio.h>
     2 #include<stdlib.h>
     3 int main(void)
     4 {
     5     int n1,n2,n3,i,j,k;
     6     int ***arr;
     7     
     8     printf("请输入所要创建的动态数组的第一维长度:");
     9     scanf("%d",&n1);
    10     printf("请输入所要创建的动态数组的第二维长度:");
    11     scanf("%d",&n2);
    12     printf("请输入所要创建的动态数组的第三维长度:");
    13     scanf("%d",&n3);
    14     
    15     if((arr = (int ***)malloc(n1*sizeof(int **)))==NULL)  /*第一维的创建*/
    16     {
    17         printf("分配内存空间失败,程序退出!");
    18         return 0;
    19     }
    20     for(i=0;i<n1;i++)
    21     {
    22         if((arr[i] = (int **)malloc(n2*sizeof(int *))) == NULL)  /*第二维的创建*/
    23         {
    24             printf("分配内存空间失败,程序退出!");
    25             return 0;
    26         }
    27         for(j=0;j<n2;j++)
    28         {
    29             if((arr[i][j] = (int *)malloc(n3*sizeof(int))) == NULL)  /*第三维的创建*/
    30             {
    31                 printf("分配内存空间失败,程序退出!");
    32                 return 0;
    33             }
    34         }
    35     }
    36     for(i=0;i<n1;i++)  /*为申请成功的数组中赋值*/
    37     {
    38         for(j=0;j<n2;j++)
    39         {
    40             for(k=0;k<n3;k++)
    41             {
    42                 arr[i][j][k]= i * n1 + j * n2 + k ;
    43                 printf("%d	",arr[i][j][k]);
    44             }
    45             printf("
    ");
    46         }
    47         printf("
    ");
    48     }
    49     /*内存的释放*/
    50     
    51     for(i=0;i<n1;i++)
    52     {
    53         for(j=0;j<n2;j++)
    54         {
    55             free(arr[i][j]);  /*释放第三维*/
    56         }
    57     }
    58     
    59     for(i=0;i<n1;i++)
    60         free(arr[i]);  /*释放第二维*/
    61     
    62     free(arr);  /*释放第一维*/
    63     
    64     return 0;
    65 }
    请输入所要创建的动态数组的第一维长度:3
    请输入所要创建的动态数组的第二维长度:3
    请输入所要创建的动态数组的第三维长度:3
    0    1    2
    3    4    5
    6    7    8
    
    3    4    5
    6    7    8
    9    10    11
    
    6    7    8
    9    10    11
    12    13    14

    总结:可以看出,动态三维数组的创建与释放与前面的一维和二维相类似,同样要注意创建的原则。
     大家可以看到,前面所说的一维,二维,三维动态数组都是一次性创建好的,如果在使用过程中要对数组进行扩展或者删减该怎么办呢?
     那就要用到这个--可扩展动态数组。关于可扩展动态数组,我将在后续的文章中阐述。

     

     

  • 相关阅读:
    HEOI2017游记
    uoj228:基础数据结构练习题
    bzoj1494【Noi2007】生成树计数
    bzoj1975【Sdoi2010】魔法猪学院
    bzoj2957:楼房重建
    uoj169:元旦老人与数列
    bzoj2178:圆的面积并
    一道好题
    Codeforces Round #440(Div.2)
    Codeforces Round #439 (Div. 2)
  • 原文地址:https://www.cnblogs.com/biantiao/p/3866645.html
Copyright © 2011-2022 走看看