您的位置 首页 基础

C言语的那些小秘密之动态数组

摘要的重要性是不言而喻的,每次发文章我都很纠结如何写出一个有特色的摘要来,能够以最为简短的文字向读者描述出我所要表达的东西。但是常常出现的问题是,摘要写得太简短了,读者看了不清楚文章究竟要讲啥;摘

  摘要的重要性是显而易见的,每次发文章我都很纠结怎么写出一个有特征的摘要来,能够以最为简略的文字向读者描绘出我所要表达的东西。可是常常呈现的问题是,摘要写得太简略了,读者看了不清楚文章终究要讲啥;摘要写得略微长点的话天然能够描绘清楚所要表达的东西,可是却也呈现了别的一个问题,便是读者看到大段的文字描绘,觉得枯燥无味,直接二话不说给文章判了个“死刑”,导致这种状况下愿意真实的花时间看完摘要的读者寥寥无几,更不用说文章的正文部分了,所以时长慨叹写文章最头疼的莫过于摘要了。

  许多人在编写C言语代码的时分很少运用动态数组,不管什么状况下统统运用静态数组的方法来处理,在当初学习C言语的时分我便是一个典型的比如,可是现在发现这是一个适当欠好的习气,乃至或许导致编写的程序呈现一些丧命的过错。特别关于搞嵌入式的人来所,嵌入式体系的内存是名贵的,内存是否高效率的运用往往意味着嵌入式设备是否高质量和高性能,所以高效的运用内存对咱们来说是很重要的。那么咱们在自己编写C言语代码的时分就应该学会运用动态数组,这也便是我这篇博客要给咱们讲的,我尽我所能的用一些简略的代码来解说动态数组,期望我所讲的对你有所协助。

  那么咱们首要来看看什么是动态数组,动态数组是相关于静态数组而言,从“动”字咱们也能够看出它的灵敏性,静态数组的长度是预先界说好的,在整个程序中,一旦给定巨细后就无法改动。而动态数组则不然,它能够随程序需求而从头指定巨细。动态数组的内存空间是从堆动态分配的。是经过履行代码而为其分配存储空间。当程序履行到咱们编写的分配句子时,才为其分配。关于静态数组,其创立十分便利,运用完也无需开释,要引证也简略,可是创立后无法改动其巨细是其丧命缺点!关于动态数组,其创立费事,运用完必须由程序员自己开释,不然将会引起内存走漏。但其运用十分灵敏,能依据程序需求动态分配巨细。所以相关于静态数组的来说咱们关于运用动态数组有很大的自由度。

  在创立动态数组的过程中咱们要遵从一个准则,那便是在创立的时分从外层往里层,逐层创立;而开释的时分从里层往外层,逐层开释。这个话你读了或许了解并不深入,不过不要急,接下来咱们看看两段代码。

  一维动态数组的创立:

  #include

  #include

  int main()

  {

  int n1,i;

  int *array;

  printf("请输入所要创立的一维动态数组的长度:");

  scanf("%d",&n1);

  array=(int*)calloc(n1,sizeof(int));

  for(i=0;i

  {

  printf("%d\t",array[i]);

  }

  printf("\n");

  for(i=0;i

  {

  array[i]=i+1;

  printf("%d\t",array[i]);

  }

  free(array);//开释榜首维指针

  return 0;

  }

  运转成果为:

  

 

  特此说明:在今后的运转成果部分,我均会附上文字成果,以防图片翻开失利。

  请输入所要创立的一维动态数组的长度:4

  0 0 0 0

  1 2 3 4 Press any key to continue

  在此我运用的是calloc()函数来分配的,一起也运用两个for句子来打印数组元素,咱们发现榜首个打印输出的数组元素值均为0,在此也是为了加深读者关于calloc()函数的形象我特别运用了它来分配,假如关于calloc()、malloc()、realloc()函数的差异仍是很清楚的读者能够去看看我的别的一篇博客——C言语的那些小秘密之内存分配。

  二维数组的创立:

  #include

  #include

  int main()

  {

  int n1,n2;

  int **array,i,j;

  printf("请输入所要创立的动态数组的榜首维长度:");

  scanf("%d",&n1);

  printf("请输入所要创立的动态数组的第二维长度:");

  scanf("%d",&n2);

  array=(int**)malloc(n1*sizeof(int*)); //榜首维

  for(i=0;i

  {

  array[i]=(int*)malloc(n2* sizeof(int));//第二维

  }

  for(i=0;i

  {

  for(j=0;j

  {

  array[i][j]=i*n2+j+1;

  printf("%d\t",array[i][j]);

  }

  printf("\n");

  }

  for(i=0;i

  {

  free(array[i]);//开释第二维指针

  }

  free(array);//开释榜首维指针

  return 0;

  }

  运转成果为:

  

 

  请输入所要创立的动态数组的榜首维长度:3

  请输入所要创立的动态数组的第二维长度:3

  1 2 3

  4 5 6

  7 8 9

  Press any key to continue

  有了上面的代码咱们再来说动态数组的树立就简略了,以二维为例,先说创立,还记得咱们上面说的创立的准则嘛:从外层往里层,逐层创立。

  array=(int**)malloc(n1*sizeof(int*)); //榜首维

  以上是咱们创立二维动态数组的最外层,创立好了最外层那么咱们接下来便是要创立次外层了。

  array[i]=(int*)malloc(n2* sizeof(int));//第二维

  在创立次外层的过程中咱们运用了一个for喜爱句子,千万别忘了运用for循环句子,这是绝大多数人的一个易错点。

  创立好了接下来咱们该讲到开释了,而开释的时分从里层往外层,逐层开释。刚刚与咱们上面的创立相反,在以上代码中咱们首要运用了下面一个for循环来开释里层。

  for(i=0;i

  {

  free(array[i]);//开释第二维指针

  }

  在经过以下句子来开释外层。

  free(array);//开释榜首维指针

  假如呈现多维的状况怎么做呢,咱们接下来再来看看一个三维动态数组的创立和开释,以加深下读者的形象。代码如下:

  #include

  #include

  int main()

  {

  int n1,n2,n3;

  int ***array;

  int i,j,k;

  printf("请输入所要创立的动态数组的榜首维长度:");

  scanf("%d",&n1);

  printf("请输入所要创立的动态数组的第二维长度:");

  scanf("%d",&n2);

  printf("请输入所要创立的动态数组的第三维长度:");

  scanf("%d",&n3);

  array=(int***)malloc(n1*sizeof(int**));//榜首维

  for(i=0; i

  {

  array[i]=(int**)malloc(n2*sizeof(int*)); //第二维

  for(j=0;j

  {

  array[i][j]=(int*)malloc(n3*sizeof(int)); //第三维

  }

  }

  for(i=0;i

  {

  for(j=0;j

  {

  for(k=0;k

  {

  array[i][j][k]=i+j+k+1;

  printf("%d\t",array[i][j][k]);

  }

  printf("\n");

  }

  printf("\n");

  }

  for(i=0;i

  {

  for(j=0;j

  {

  free(array[i][j]);//开释第三维指针

  }

  }

  for(i=0;i

  {

  free(array[i]);//开释第二维指针

  }

  free(array);//开释榜首维指针

  return 0;

  }

  运转成果为:

  

 

  请输入所要创立的动态数组的榜首维长度:3

  请输入所要创立的动态数组的第二维长度:3

  请输入所要创立的动态数组的第三维长度:3

  1 2 3

  2 3 4

  3 4 5

  2 3 4

  3 4 5

  4 5 6

  3 4 5

  4 5 6

  5 6 7

  Press any key to continue

  看了以上三维动态数组的创立和开释代码今后,我想读者这个时分现已能够自己编写恣意维的动态数组了。可是仔细的读者或许发现了一个问题,那便是咱们所讲的动态数组都是一次性创立好的,假如接下来在运用的过程中咱们运用的数组需求扩展或许删减一些不再运用元素该怎么办呢?!接下来咱们先看一段关于动态数组扩展的代码,在此以一维动态数组的扩展为例,其它的以此类推。

  #include

  #include

  int main()

  {

  int*n,*p;

  int i,n1,n2;

  printf("请输入所要创立的动态数组的长度:");

  scanf("%d",&n1);

  n=(int*)calloc(n1,sizeof(int));

  printf("请输入所要扩展的动态数组的长度:");

  scanf("%d",&n2);

  p=(int*)realloc(n,(n2)*sizeof(int));//动态扩大数组

  for(i=0;i

  {

  p[i]=i+1;

  if(i%5==0)

  printf("\n");

  printf("%d\t",p[i]);

  }

  free(p);

  return 0;

  }

  运转成果如下:

  

 

  请输入所要创立的动态数组的长度:6

  请输入所要扩展的动态数组的长度:25

  1 2 3 4 5

  6 7 8 9 10

  11 12 13 14 15

  16 17 18 19 20

  21 22 23 24 25 Press any key to continue

  看了上面的代码读者应该知道怎么来扩展动态数组了,或许有的读者关于realloc()函数的运用有些生疏,假如有什么疑问的话能够参阅我之前写的一篇博文——C言语的那些小秘密之内存分配,在此我就不再做过多的解说了。

  接下来怎么缩小动态数组。

  #include

  #include

  int main()

  {

  int*n,*p;

  int i,n1,n2;

  printf("请输入所要创立的动态数组的长度:");

  scanf("%d",&n1);

  n=(int*)calloc(n1,sizeof(int));

  for(i=0;i

  {

  n[i]=i+1;

  if(i%5==0)

  printf("\n");

  printf("%d\t",n[i]);

  }

  printf("\n请输入所要缩小的动态数组的长度:");

  scanf("%d",&n2);

  p=(int*)realloc(n,(n2)*sizeof(int));

  for(i=0;i

  {

  if(i%5==0)

  printf("\n");

  printf("%d\t",p[i]);

  }

  printf("\n");

  free(p);

  return 0;

  }

  运转成果为:

  

 

  请输入所要创立的动态数组的长度:25

  1 2 3 4 5

  6 7 8 9 10

  11 12 13 14 15

  16 17 18 19 20

  21 22 23 24 25

  请输入所要缩小的动态数组的长度:15

  1 2 3 4 5

  6 7 8 9 10

  11 12 13 14 15

  Press any key to continue

  在这里值得留意的一点便是在减缩动态数组的时分,它是删除了后边的元素,而前面的元素坚持不变。在运用realloc()函数的时分要由其留意它的运用规矩。

  讲到这儿就到了该说完毕的时分了,因为自己水平有限,博客中的不当或过错之处在所难免,殷切期望读者批评指正。一起也欢迎读者一起讨论相关的内容,假如愿意沟通的话请留下你名贵的定见。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/zhishi/jichu/116619.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部