国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

C語言的那些小秘密之動態(tài)數(shù)組

發(fā)布時間:2016-2-18 14:15    發(fā)布者:designapp
  摘要的重要性是不言而喻的,每次發(fā)文章我都很糾結如何寫出一個有特色的摘要來,能夠以最為簡短的文字向讀者描述出我所要表達的東西。但是常常出現(xiàn)的問題是,摘要寫得太簡短了,讀者看了不清楚文章究竟要講啥;摘要寫得稍微長點的話自然能夠描述清楚所要表達的東西,但是卻也出現(xiàn)了另外一個問題,就是讀者看到大段的文字描述,覺得枯燥無味,直接二話不說給文章判了個“死刑”,導致這種情況下愿意真正的花時間看完摘要的讀者屈指可數(shù),更不用說文章的正文部分了,所以時長感慨寫文章最頭疼的莫過于摘要了。
  很多人在編寫C語言代碼的時候很少使用動態(tài)數(shù)組,不管什么情況下通通使用靜態(tài)數(shù)組的方法來解決,在當初學習C語言的時候我就是一個典型的例子,但是現(xiàn)在發(fā)現(xiàn)這是一個相當不好的習慣,甚至可能導致編寫的程序出現(xiàn)一些致命的錯誤。尤其對于搞嵌入式的人來所,嵌入式系統(tǒng)的內(nèi)存是寶貴的,內(nèi)存是否高效率的使用往往意味著嵌入式設備是否高質(zhì)量和高性能,所以高效的使用內(nèi)存對我們來說是很重要的。那么我們在自己編寫C語言代碼的時候就應該學會使用動態(tài)數(shù)組,這也就是我這篇博客要給大家講的,我盡我所能的用一些簡單的代碼來講解動態(tài)數(shù)組,希望我所講的對你有所幫助。
  那么我們首先來看看什么是動態(tài)數(shù)組,動態(tài)數(shù)組是相對于靜態(tài)數(shù)組而言,從“動”字我們也可以看出它的靈活性,靜態(tài)數(shù)組的長度是預先定義好的,在整個程序中,一旦給定大小后就無法改變。而動態(tài)數(shù)組則不然,它可以隨程序需要而重新指定大小。動態(tài)數(shù)組的內(nèi)存空間是從堆動態(tài)分配的。是通過執(zhí)行代碼而為其分配存儲空間。當程序執(zhí)行到我們編寫的分配語句時,才為其分配。對于靜態(tài)數(shù)組,其創(chuàng)建非常方便,使用完也無需釋放,要引用也簡單,但是創(chuàng)建后無法改變其大小是其致命弱點!對于動態(tài)數(shù)組,其創(chuàng)建麻煩,使用完必須由程序員自己釋放,否則將會引起內(nèi)存泄露。但其使用非常靈活,能根據(jù)程序需要動態(tài)分配大小。所以相對于靜態(tài)數(shù)組的來說我們對于使用動態(tài)數(shù)組有很大的自由度。
  在創(chuàng)建動態(tài)數(shù)組的過程中我們要遵循一個原則,那就是在創(chuàng)建的時候從外層往里層,逐層創(chuàng)建;而釋放的時候從里層往外層,逐層釋放。這個話你讀了可能理解并不深刻,不過不要急,接下來我們看看兩段代碼。
  一維動態(tài)數(shù)組的創(chuàng)建:
  #include
  #include
  int main()
  {
  int n1,i;
  int *array;
  printf("請輸入所要創(chuàng)建的一維動態(tài)數(shù)組的長度:");
  scanf("%d",&n1);
  array=(int*)calloc(n1,sizeof(int));
  for(i=0;i
  {
  printf("%d\t",array);
  }
  printf("\n");
  for(i=0;i
  {
  array=i+1;
  printf("%d\t",array);
  }
  free(array);//釋放第一維指針
  return 0;
  }
  運行結果為:
  


  特此說明:在以后的運行結果部分,我均會附上文字結果,以防圖片打開失敗。
  請輸入所要創(chuàng)建的一維動態(tài)數(shù)組的長度:4
  0 0 0 0
  1 2 3 4 Press any key to continue
  在此我使用的是calloc()函數(shù)來分配的,同時也使用兩個for語句來打印數(shù)組元素,我們發(fā)現(xiàn)第一個打印輸出的數(shù)組元素值均為0,在此也是為了加深讀者對于calloc()函數(shù)的印象我特地使用了它來分配,如果對于calloc()、malloc()、realloc()函數(shù)的區(qū)別還是很清楚的讀者可以去看看我的另外一篇博客------C語言的那些小秘密之內(nèi)存分配。
  二維數(shù)組的創(chuàng)建:
  #include
  #include
  int main()
  {
  int n1,n2;
  int **array,i,j;
  printf("請輸入所要創(chuàng)建的動態(tài)數(shù)組的第一維長度:");
  scanf("%d",&n1);
  printf("請輸入所要創(chuàng)建的動態(tài)數(shù)組的第二維長度:");
  scanf("%d",&n2);
  array=(int**)malloc(n1*sizeof(int*)); //第一維
  for(i=0;i
  {
  array=(int*)malloc(n2* sizeof(int));//第二維
  }
  for(i=0;i
  {
  for(j=0;j
  {
  array[j]=i*n2+j+1;
  printf("%d\t",array[j]);
  }
  printf("\n");
  }
  for(i=0;i
  {
  free(array);//釋放第二維指針
  }
  free(array);//釋放第一維指針
  return 0;
  }
  運行結果為:
  


  請輸入所要創(chuàng)建的動態(tài)數(shù)組的第一維長度:3
  請輸入所要創(chuàng)建的動態(tài)數(shù)組的第二維長度:3
  1 2 3
  4 5 6
  7 8 9
  Press any key to continue
  有了上面的代碼我們再來說動態(tài)數(shù)組的建立就簡單了,以二維為例,先說創(chuàng)建,還記得我們上面說的創(chuàng)建的原則嘛:從外層往里層,逐層創(chuàng)建。
  array=(int**)malloc(n1*sizeof(int*)); //第一維
  以上是我們創(chuàng)建二維動態(tài)數(shù)組的最外層,創(chuàng)建好了最外層那么我們接下來就是要創(chuàng)建次外層了。
  array=(int*)malloc(n2* sizeof(int));//第二維
  在創(chuàng)建次外層的過程中我們使用了一個for喜歡語句,千萬別忘了使用for循環(huán)語句,這是絕大多數(shù)人的一個易錯點。
  創(chuàng)建好了接下來我們該講到釋放了,而釋放的時候從里層往外層,逐層釋放。剛剛與我們上面的創(chuàng)建相反,在以上代碼中我們首先使用了下面一個for循環(huán)來釋放里層。
  for(i=0;i
  {
  free(array);//釋放第二維指針
  }
  在通過以下語句來釋放外層。
  free(array);//釋放第一維指針
  如果出現(xiàn)多維的情況怎么做呢,我們接下來再來看看一個三維動態(tài)數(shù)組的創(chuàng)建和釋放,以加深下讀者的印象。代碼如下:
  #include
  #include
  int main()
  {
  int n1,n2,n3;
  int ***array;
  int i,j,k;
  printf("請輸入所要創(chuàng)建的動態(tài)數(shù)組的第一維長度:");
  scanf("%d",&n1);
  printf("請輸入所要創(chuàng)建的動態(tài)數(shù)組的第二維長度:");
  scanf("%d",&n2);
  printf("請輸入所要創(chuàng)建的動態(tài)數(shù)組的第三維長度:");
  scanf("%d",&n3);
  array=(int***)malloc(n1*sizeof(int**));//第一維
  for(i=0; i
  {
  array=(int**)malloc(n2*sizeof(int*)); //第二維
  for(j=0;j
  {
  array[j]=(int*)malloc(n3*sizeof(int)); //第三維
  }
  }
  for(i=0;i
  {
  for(j=0;j
  {
  for(k=0;k
  {
  array[j][k]=i+j+k+1;
  printf("%d\t",array[j][k]);
  }
  printf("\n");
  }
  printf("\n");
  }
  for(i=0;i
  {
  for(j=0;j
  {
  free(array[j]);//釋放第三維指針
  }
  }
  for(i=0;i
  {
  free(array);//釋放第二維指針
  }
  free(array);//釋放第一維指針
  return 0;
  }
  運行結果為:
  


  請輸入所要創(chuàng)建的動態(tài)數(shù)組的第一維長度:3
  請輸入所要創(chuàng)建的動態(tài)數(shù)組的第二維長度:3
  請輸入所要創(chuàng)建的動態(tài)數(shù)組的第三維長度: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
  看了以上三維動態(tài)數(shù)組的創(chuàng)建和釋放代碼以后,我想讀者這個時候已經(jīng)可以自己編寫任意維的動態(tài)數(shù)組了。但是細心的讀者可能發(fā)現(xiàn)了一個問題,那就是我們所講的動態(tài)數(shù)組都是一次性創(chuàng)建好的,如果接下來在使用的過程中我們使用的數(shù)組需要擴展或者刪減一些不再使用元素該怎么辦呢?!接下來我們先看一段關于動態(tài)數(shù)組擴展的代碼,在此以一維動態(tài)數(shù)組的擴展為例,其它的以此類推。
  #include
  #include
  int main()
  {
  int*n,*p;
  int i,n1,n2;
  printf("請輸入所要創(chuàng)建的動態(tài)數(shù)組的長度:");
  scanf("%d",&n1);
  n=(int*)calloc(n1,sizeof(int));
  printf("請輸入所要擴展的動態(tài)數(shù)組的長度:");
  scanf("%d",&n2);
  p=(int*)realloc(n,(n2)*sizeof(int));//動態(tài)擴充數(shù)組
  for(i=0;i
  {
  p=i+1;
  if(i%5==0)
  printf("\n");
  printf("%d\t",p);
  }
  free(p);
  return 0;
  }
  運行結果如下:
  


  請輸入所要創(chuàng)建的動態(tài)數(shù)組的長度:6
  請輸入所要擴展的動態(tài)數(shù)組的長度: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
  看了上面的代碼讀者應該知道如何來擴展動態(tài)數(shù)組了,可能有的讀者對于realloc()函數(shù)的使用有些陌生,如果有什么疑惑的話可以參考我之前寫的一篇博文------C語言的那些小秘密之內(nèi)存分配,在此我就不再做過多的講解了。
  接下來如何縮小動態(tài)數(shù)組。
  #include
  #include
  int main()
  {
  int*n,*p;
  int i,n1,n2;
  printf("請輸入所要創(chuàng)建的動態(tài)數(shù)組的長度:");
  scanf("%d",&n1);
  n=(int*)calloc(n1,sizeof(int));
  for(i=0;i
  {
  n=i+1;
  if(i%5==0)
  printf("\n");
  printf("%d\t",n);
  }
  printf("\n請輸入所要縮小的動態(tài)數(shù)組的長度:");
  scanf("%d",&n2);
  p=(int*)realloc(n,(n2)*sizeof(int));
  for(i=0;i
  {
  if(i%5==0)
  printf("\n");
  printf("%d\t",p);
  }
  printf("\n");
  free(p);
  return 0;
  }
  運行結果為:
  


  請輸入所要創(chuàng)建的動態(tài)數(shù)組的長度: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
  請輸入所要縮小的動態(tài)數(shù)組的長度:15
  1 2 3 4 5
  6 7 8 9 10
  11 12 13 14 15
  Press any key to continue
  在這里值得注意的一點就是在縮減動態(tài)數(shù)組的時候,它是刪除了后面的元素,而前面的元素保持不變。在使用realloc()函數(shù)的時候要由其注意它的使用規(guī)則。
  講到這兒就到了該說結束的時候了,由于本人水平有限,博客中的不妥或錯誤之處在所難免,殷切希望讀者批評指正。同時也歡迎讀者共同探討相關的內(nèi)容,如果樂意交流的話請留下你寶貴的意見。
                               
               
本文地址:http://m.qingdxww.cn/thread-160877-1-1.html     【打印本頁】

本站部分文章為轉載或網(wǎng)友發(fā)布,目的在于傳遞和分享信息,并不代表本網(wǎng)贊同其觀點和對其真實性負責;文章版權歸原作者及原出處所有,如涉及作品內(nèi)容、版權和其它問題,我們將根據(jù)著作權人的要求,第一時間更正或刪除。
您需要登錄后才可以發(fā)表評論 登錄 | 立即注冊

廠商推薦

  • Microchip視頻專區(qū)
  • Dev Tool Bits——使用MPLAB® Discover瀏覽資源
  • Dev Tool Bits——使用條件軟件斷點宏來節(jié)省時間和空間
  • Dev Tool Bits——使用DVRT協(xié)議查看項目中的數(shù)據(jù)
  • Dev Tool Bits——使用MPLAB® Data Visualizer進行功率監(jiān)視
  • 貿(mào)澤電子(Mouser)專區(qū)
關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權所有   京ICP備16069177號 | 京公網(wǎng)安備11010502021702
快速回復 返回頂部 返回列表
主站蜘蛛池模板: 青青青青久久久久国产的 | 国产欧美一区二区三区免费 | 欧美性xxxxx极品视频 | 四虎国产永久免费久久 | 天堂网在线www | 韩国演艺圈精品一区二区 | 国产高清在线精品一区在线 | 亚洲男人天堂2023 | 最新亚洲人成网站在线影院 | 免费无限制观看黄的网址 | 欧美黄色tv | 日韩欧美精品中文字幕 | 亚洲一区免费在线观看 | 蘑菇香蕉茄子绿巨人丝瓜草莓 | 亚洲四虎| 日本三级黄视频 | 动漫在线观看免费肉肉 | 国产日韩欧美一区二区三区在线 | 久久国产精品女 | 国产香蕉久久精品综合网 | 欧美人与动牲高清 | 弄农村老妇呻吟 | 极品尤物一区二区三区 | 五月天精品 | 在线播放69热精品视频 | 国产精品福利久久2020 | 久热精品在线视频 | 国产精品成人观看视频免费 | 久久亚洲私人国产精品 | 国产精品视频免费 | 日本在线视频一区二区三区 | 亚洲成人手机在线 | 欧美激情一级欧美精品 | 99热这里只有精品88 | 久久精品国产亚洲香蕉 | 高清在线一区二区 | 力王国语在线观看完整国语版免费 | 国产伊人网 | 69视频在线观看高清 | 男女www| 国产网站麻豆精品视频 |