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

C語言的那些小秘密之動態數組

發布時間:2016-2-18 14:15    發布者:designapp
關鍵詞: 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);
  }
  printf("\n");
  for(i=0;i
  {
  array=i+1;
  printf("%d\t",array);
  }
  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=(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;
  }
  運行結果為:
  


  請輸入所要創建的動態數組的第一維長度:3
  請輸入所要創建的動態數組的第二維長度:3
  1 2 3
  4 5 6
  7 8 9
  Press any key to continue
  有了上面的代碼我們再來說動態數組的建立就簡單了,以二維為例,先說創建,還記得我們上面說的創建的原則嘛:從外層往里層,逐層創建。
  array=(int**)malloc(n1*sizeof(int*)); //第一維
  以上是我們創建二維動態數組的最外層,創建好了最外層那么我們接下來就是要創建次外層了。
  array=(int*)malloc(n2* sizeof(int));//第二維
  在創建次外層的過程中我們使用了一個for喜歡語句,千萬別忘了使用for循環語句,這是絕大多數人的一個易錯點。
  創建好了接下來我們該講到釋放了,而釋放的時候從里層往外層,逐層釋放。剛剛與我們上面的創建相反,在以上代碼中我們首先使用了下面一個for循環來釋放里層。
  for(i=0;i
  {
  free(array);//釋放第二維指針
  }
  在通過以下語句來釋放外層。
  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=(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;
  }
  運行結果為:
  


  請輸入所要創建的動態數組的第一維長度: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+1;
  if(i%5==0)
  printf("\n");
  printf("%d\t",p);
  }
  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+1;
  if(i%5==0)
  printf("\n");
  printf("%d\t",n);
  }
  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);
  }
  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()函數的時候要由其注意它的使用規則。
  講到這兒就到了該說結束的時候了,由于本人水平有限,博客中的不妥或錯誤之處在所難免,殷切希望讀者批評指正。同時也歡迎讀者共同探討相關的內容,如果樂意交流的話請留下你寶貴的意見。
                               
               
本文地址:http://m.qingdxww.cn/thread-160877-1-1.html     【打印本頁】

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

廠商推薦

  • Microchip視頻專區
  • Dev Tool Bits——使用MPLAB® Discover瀏覽資源
  • Dev Tool Bits——使用條件軟件斷點宏來節省時間和空間
  • Dev Tool Bits——使用DVRT協議查看項目中的數據
  • Dev Tool Bits——使用MPLAB® Data Visualizer進行功率監視
  • 貿澤電子(Mouser)專區
關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品真实对白精彩久久 | 亚洲欧美日韩成人一区在线 | 黄色免费网站在线观看 | 拍拍叫痛的无挡视频免费 | 亚洲一区毛片 | 中文字幕在线播放量 | 91入口| 日韩精品毛片 | 国内精品视频在线播放一区 | 中文字幕曰韩一区二区不卡 | 欧美一级黑人片 | 婷婷久草| 免费看黄视频网站 | 国产我不卡 | 亚洲va在线va天堂va四虎 | 免费的高清影视网站 | 一区二区视频网 | 亚洲乱轮视频 | 黄工厂精品视频在线观看 | 日本不卡二 | 久久伊人中文字幕 | 天天操夜夜摸 | 欧美日韩国产色综合一二三四 | 99久久99久久精品免费看子伦 | 手机在线国产精品 | 国产一区二区高清视频 | 亚洲免费色视频 | 久久久国产一区二区三区 | 精品久久久久久久九九九精品 | 久久综合结合久久很很很97色 | 欧美日韩中文字幕在线观看 | 蜜臀首页| 国产精品成人网红女主播 | 日韩在线视频观看 | 亚洲欧美在线观看 | 免费的黄色片视频 | 最近2019中文字幕最新 | 精品久久久一二三区 | 99国产热| 天天摸天天操天天射 | 国产一级毛片网站 |