C++二維數組動態申請內存


  好久沒用C++刷題了,今天早上刷了幾條題,感覺很陌生了。怪我,大二下實在太頹廢了,沒啥作為。

  今天更新個關於c++二維數組內存申請的問題,當初作為菜鳥初學指針的時候,還是在這方面有點搞不通的。今天用到了,順便寫下來,適當時候給C++初學者用用。

-----------C++二維數組動態申請內存--------------

  如果對new和delete不是很了解的話可以到這里來看看,http://www.cnblogs.com/hazir/p/new_and_delete.html

  首先,我們一般需要用到數組的時候,都是直接聲明,比如:

1 int array[3][3];

  但是,在某些情況下,數組的維數我們是不知道的,可能是等待用戶輸入維數,這時候需要用變量來指定維數了。可是,我們不能直接這樣聲明數組,因為C++不允許直接用變量作為維數聲明,必須用常量,像這樣就會報編譯錯誤:

 

  這時候就需要用new來動態申請數組了。我們一步一步來,申請一維數組的時候,我們可以這樣寫:

int num = 3;
int* array = new int[num];

  這段代碼的意思就是,用new來申請num個int類型的空間,然后返回那段空間的首地址,再賦給array。可見array是一個int類型的指針,指向那段空間的首地址。語法和邏輯無誤,正常運行。

  但是,申請二維數組的時候,就可能要對指針這一知識點要掌握得比較好一點,理解得比較透徹。先貼代碼,再分析:

  

  int num = 3;
  int** array = new int*[num];
  for(int i=0; i<num; ++i) {
    array[i] = new int[num];
  }

  看完這段代碼,還是有點糊塗的。為什么array是int**類型?為什么還要用循環來分配空間?我們再來看下面注釋版的代碼:

  

  int num = 3;
(
int*)* array = new int*[num]; // 申請int*類型數組的內存空間,賦值給(int*)*類型的array for(int i=0; i<num; ++i) { array[i] = new int[num]; // 分別給int*類型的數組申請空間,即一維數組的動態申請。 }

  現在我來解釋一下,其實我們可以把二維數組理解成為很多一維數組的集合。比如說:int array[4][3],其實它就是由4個長度為3的一維數組組成的。array[0]指的就是第一個一維數組。可以推出,array[0],array[1],array[2], array[3]就是int*類型的指針,用來分別指向一維數組。那么,array又是什么呢?很顯然,array就是(int*)*類型的指針,指向剛才那4個int*指針類型占用空間的首地址。有點繞?看圖:

  因此,聯系上圖,我們先new4個int*類型,將首地址賦值給array。再用循環每次new4個int類型,首地址指向對應的int*類型的指針。

  了解之后,我們當然要用delete釋放內存,就不細說了,怎么申請怎么釋放,並且是逆着回來釋放空間,看代碼:

 for(int i=0; i<num; i++) {
  delete[] array[i];
 }
 delete[] array;

 

 

好吧!我已經盡量講得很詳細了!其實這段代碼不難,認真思考一下就行了。可是我還是苦口婆心的很仔細的講了,可能為了以后和我一樣的菜鳥剛學指針時有緣看到這篇博客可以對他有些幫助吧,其實我已經對這個爛熟於心了,為什么還要這么仔細得寫呢?會不會浪費時間浪費精力?我不知道,可能再熟悉再小的問題,也可能會有自己不懂的學問在里面吧。總之,每篇博客,盡量寫到最好!

 

停筆!過幾天會更新關於new和delete的知識點!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM