《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\t",arr[i]);
18         if(0==(i+1)%4)
19             printf("\n");  /*一行打印四个元素*/
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\t",arr[i][j]);
30         }
31         printf("\n");
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\t",arr[i][j][k]);
44             }
45             printf("\n");
46         }
47         printf("\n");
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

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

 

 

posted @ 2014-07-24 22:28  南湘潇雨  阅读(9454)  评论(2编辑  收藏  举报