首页 > 代码库 > 《C语言中动态数组的创建及引用》
《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 }
该代码的运行结果为:
请输入所要创建的一维动态数组的长度:121 2 3 45 6 7 89 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请输入所要创建的动态数组的第二维长度:31 2 34 5 67 8 910 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请输入所要创建的动态数组的第三维长度:30 1 23 4 56 7 83 4 56 7 89 10 116 7 89 10 1112 13 14
总结:可以看出,动态三维数组的创建与释放与前面的一维和二维相类似,同样要注意创建的原则。
大家可以看到,前面所说的一维,二维,三维动态数组都是一次性创建好的,如果在使用过程中要对数组进行扩展或者删减该怎么办呢?
那就要用到这个--可扩展动态数组。关于可扩展动态数组,我将在后续的文章中阐述。