<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 牛人業(yè)話(huà) > C語(yǔ)言的那些小秘密之動(dòng)態(tài)數組

C語(yǔ)言的那些小秘密之動(dòng)態(tài)數組

作者: 時(shí)間:2015-04-08 來(lái)源:網(wǎng)絡(luò ) 收藏

  摘要的重要性是不言而喻的,每次發(fā)文章我都很糾結如何寫(xiě)出一個(gè)有特色的摘要來(lái),能夠以最為簡(jiǎn)短的文字向讀者描述出我所要表達的東西。但是常常出現的問(wèn)題是,摘要寫(xiě)得太簡(jiǎn)短了,讀者看了不清楚文章究竟要講啥;摘要寫(xiě)得稍微長(cháng)點(diǎn)的話(huà)自然能夠描述清楚所要表達的東西,但是卻也出現了另外一個(gè)問(wèn)題,就是讀者看到大段的文字描述,覺(jué)得枯燥無(wú)味,直接二話(huà)不說(shuō)給文章判了個(gè)“死刑”,導致這種情況下愿意真正的花時(shí)間看完摘要的讀者屈指可數,更不用說(shuō)文章的正文部分了,所以時(shí)長(cháng)感慨寫(xiě)文章最頭疼的莫過(guò)于摘要了。

本文引用地址:http://dyxdggzs.com/article/272201.htm

  很多人在編寫(xiě)代碼的時(shí)候很少使用,不管什么情況下通通使用靜態(tài)數組的方法來(lái)解決,在當初學(xué)習的時(shí)候我就是一個(gè)典型的例子,但是現在發(fā)現這是一個(gè)相當不好的習慣,甚至可能導致編寫(xiě)的程序出現一些致命的錯誤。尤其對于搞嵌入式的人來(lái)所,嵌入式系統的內存是寶貴的,內存是否高效率的使用往往意味著(zhù)嵌入式設備是否高質(zhì)量和高性能,所以高效的使用內存對我們來(lái)說(shuō)是很重要的。那么我們在自己編寫(xiě)代碼的時(shí)候就應該學(xué)會(huì )使用,這也就是我這篇博客要給大家講的,我盡我所能的用一些簡(jiǎn)單的代碼來(lái)講解,希望我所講的對你有所幫助。

  那么我們首先來(lái)看看什么是動(dòng)態(tài)數組,動(dòng)態(tài)數組是相對于靜態(tài)數組而言,從“動(dòng)”字我們也可以看出它的靈活性,靜態(tài)數組的長(cháng)度是預先定義好的,在整個(gè)程序中,一旦給定大小后就無(wú)法改變。而動(dòng)態(tài)數組則不然,它可以隨程序需要而重新指定大小。動(dòng)態(tài)數組的內存空間是從堆動(dòng)態(tài)分配的。是通過(guò)執行代碼而為其分配存儲空間。當程序執行到我們編寫(xiě)的分配語(yǔ)句時(shí),才為其分配。對于靜態(tài)數組,其創(chuàng )建非常方便,使用完也無(wú)需釋放,要引用也簡(jiǎn)單,但是創(chuàng )建后無(wú)法改變其大小是其致命弱點(diǎn)!對于動(dòng)態(tài)數組,其創(chuàng )建麻煩,使用完必須由程序員自己釋放,否則將會(huì )引起內存泄露。但其使用非常靈活,能根據程序需要動(dòng)態(tài)分配大小。所以相對于靜態(tài)數組的來(lái)說(shuō)我們對于使用動(dòng)態(tài)數組有很大的自由度。

  在創(chuàng )建動(dòng)態(tài)數組的過(guò)程中我們要遵循一個(gè)原則,那就是在創(chuàng )建的時(shí)候從外層往里層,逐層創(chuàng )建;而釋放的時(shí)候從里層往外層,逐層釋放。這個(gè)話(huà)你讀了可能理解并不深刻,不過(guò)不要急,接下來(lái)我們看看兩段代碼。

  一維動(dòng)態(tài)數組的創(chuàng )建:

  #include

  #include

  int main()

  {

  int n1,i;

  int *array;

  printf("請輸入所要創(chuàng )建的一維動(dòng)態(tài)數組的長(cháng)度:");

  scanf("%d",&n1);

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

  for(i=0;i

  {

  printf("%dt",array[i]);

  }

  printf("n");

  for(i=0;i

  {

  array[i]=i+1;

  printf("%dt",array[i]);

  }

  free(array);//釋放第一維指針

  return 0;

  }

  運行結果為:

  

 

  特此說(shuō)明:在以后的運行結果部分,我均會(huì )附上文字結果,以防圖片打開(kāi)失敗。

  請輸入所要創(chuàng )建的一維動(dòng)態(tài)數組的長(cháng)度:4

  0 0 0 0

  1 2 3 4 Press any key to continue

  在此我使用的是calloc()函數來(lái)分配的,同時(shí)也使用兩個(gè)for語(yǔ)句來(lái)打印數組元素,我們發(fā)現第一個(gè)打印輸出的數組元素值均為0,在此也是為了加深讀者對于calloc()函數的印象我特地使用了它來(lái)分配,如果對于calloc()、malloc()、realloc()函數的區別還是很清楚的讀者可以去看看我的另外一篇博客------C語(yǔ)言的那些小秘密之內存分配。

  二維數組的創(chuàng )建:

  #include

  #include

  int main()

  {

  int n1,n2;

  int **array,i,j;

  printf("請輸入所要創(chuàng )建的動(dòng)態(tài)數組的第一維長(cháng)度:");

  scanf("%d",&n1);

  printf("請輸入所要創(chuàng )建的動(dòng)態(tài)數組的第二維長(cháng)度:");

  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("%dt",array[i][j]);

  }

  printf("n");

  }

  for(i=0;i

  {

  free(array[i]);//釋放第二維指針

  }

  free(array);//釋放第一維指針

  return 0;

  }

  運行結果為:

  

 

  請輸入所要創(chuàng )建的動(dòng)態(tài)數組的第一維長(cháng)度:3

  請輸入所要創(chuàng )建的動(dòng)態(tài)數組的第二維長(cháng)度:3

  1 2 3

  4 5 6

  7 8 9

  Press any key to continue

  有了上面的代碼我們再來(lái)說(shuō)動(dòng)態(tài)數組的建立就簡(jiǎn)單了,以二維為例,先說(shuō)創(chuàng )建,還記得我們上面說(shuō)的創(chuàng )建的原則嘛:從外層往里層,逐層創(chuàng )建。

  array=(int**)malloc(n1*sizeof(int*)); //第一維

  以上是我們創(chuàng )建二維動(dòng)態(tài)數組的最外層,創(chuàng )建好了最外層那么我們接下來(lái)就是要創(chuàng )建次外層了。

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

  在創(chuàng )建次外層的過(guò)程中我們使用了一個(gè)for喜歡語(yǔ)句,千萬(wàn)別忘了使用for循環(huán)語(yǔ)句,這是絕大多數人的一個(gè)易錯點(diǎn)。

  創(chuàng )建好了接下來(lái)我們該講到釋放了,而釋放的時(shí)候從里層往外層,逐層釋放。剛剛與我們上面的創(chuàng )建相反,在以上代碼中我們首先使用了下面一個(gè)for循環(huán)來(lái)釋放里層。

  for(i=0;i

  {

  free(array[i]);//釋放第二維指針

  }

  在通過(guò)以下語(yǔ)句來(lái)釋放外層。

  free(array);//釋放第一維指針

  如果出現多維的情況怎么做呢,我們接下來(lái)再來(lái)看看一個(gè)三維動(dòng)態(tài)數組的創(chuàng )建和釋放,以加深下讀者的印象。代碼如下:

  #include

  #include

  int main()

  {

  int n1,n2,n3;

  int ***array;

  int i,j,k;

  printf("請輸入所要創(chuàng )建的動(dòng)態(tài)數組的第一維長(cháng)度:");

  scanf("%d",&n1);

  printf("請輸入所要創(chuàng )建的動(dòng)態(tài)數組的第二維長(cháng)度:");

  scanf("%d",&n2);

  printf("請輸入所要創(chuàng )建的動(dòng)態(tài)數組的第三維長(cháng)度:");

  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("%dt",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;

  }

  運行結果為:

  

 

  請輸入所要創(chuàng )建的動(dòng)態(tài)數組的第一維長(cháng)度:3

  請輸入所要創(chuàng )建的動(dòng)態(tài)數組的第二維長(cháng)度:3

  請輸入所要創(chuàng )建的動(dòng)態(tài)數組的第三維長(cháng)度: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

  看了以上三維動(dòng)態(tài)數組的創(chuàng )建和釋放代碼以后,我想讀者這個(gè)時(shí)候已經(jīng)可以自己編寫(xiě)任意維的動(dòng)態(tài)數組了。但是細心的讀者可能發(fā)現了一個(gè)問(wèn)題,那就是我們所講的動(dòng)態(tài)數組都是一次性創(chuàng )建好的,如果接下來(lái)在使用的過(guò)程中我們使用的數組需要擴展或者刪減一些不再使用元素該怎么辦呢?!接下來(lái)我們先看一段關(guān)于動(dòng)態(tài)數組擴展的代碼,在此以一維動(dòng)態(tài)數組的擴展為例,其它的以此類(lèi)推。

  #include

  #include

  int main()

  {

  int*n,*p;

  int i,n1,n2;

  printf("請輸入所要創(chuàng )建的動(dòng)態(tài)數組的長(cháng)度:");

  scanf("%d",&n1);

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

  printf("請輸入所要擴展的動(dòng)態(tài)數組的長(cháng)度:");

  scanf("%d",&n2);

  p=(int*)realloc(n,(n2)*sizeof(int));//動(dòng)態(tài)擴充數組

  for(i=0;i

  {

  p[i]=i+1;

  if(i%5==0)

  printf("n");

  printf("%dt",p[i]);

  }

  free(p);

  return 0;

  }

  運行結果如下:

  

 

  請輸入所要創(chuàng )建的動(dòng)態(tài)數組的長(cháng)度:6

  請輸入所要擴展的動(dòng)態(tài)數組的長(cháng)度: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

  看了上面的代碼讀者應該知道如何來(lái)擴展動(dòng)態(tài)數組了,可能有的讀者對于realloc()函數的使用有些陌生,如果有什么疑惑的話(huà)可以參考我之前寫(xiě)的一篇博文------C語(yǔ)言的那些小秘密之內存分配,在此我就不再做過(guò)多的講解了。

  接下來(lái)如何縮小動(dòng)態(tài)數組。

  #include

  #include

  int main()

  {

  int*n,*p;

  int i,n1,n2;

  printf("請輸入所要創(chuàng )建的動(dòng)態(tài)數組的長(cháng)度:");

  scanf("%d",&n1);

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

  for(i=0;i

  {

  n[i]=i+1;

  if(i%5==0)

  printf("n");

  printf("%dt",n[i]);

  }

  printf("n請輸入所要縮小的動(dòng)態(tài)數組的長(cháng)度:");

  scanf("%d",&n2);

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

  for(i=0;i

  {

  if(i%5==0)

  printf("n");

  printf("%dt",p[i]);

  }

  printf("n");

  free(p);

  return 0;

  }

  運行結果為:

  

 

  請輸入所要創(chuàng )建的動(dòng)態(tài)數組的長(cháng)度: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

  請輸入所要縮小的動(dòng)態(tài)數組的長(cháng)度:15

  1 2 3 4 5

  6 7 8 9 10

  11 12 13 14 15

  Press any key to continue

  在這里值得注意的一點(diǎn)就是在縮減動(dòng)態(tài)數組的時(shí)候,它是刪除了后面的元素,而前面的元素保持不變。在使用realloc()函數的時(shí)候要由其注意它的使用規則。

  講到這兒就到了該說(shuō)結束的時(shí)候了,由于本人水平有限,博客中的不妥或錯誤之處在所難免,殷切希望讀者批評指正。同時(shí)也歡迎讀者共同探討相關(guān)的內容,如果樂(lè )意交流的話(huà)請留下你寶貴的意見(jiàn)。

c語(yǔ)言相關(guān)文章:c語(yǔ)言教程




評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>