很久沒用C++刷題了,今天早上刷了幾條題,感受很陌生了。怪我,大二下實在太頹廢了,沒啥做爲。html
今天更新個關於c++二維數組內存申請的問題,當初做爲菜鳥初學指針的時候,仍是在這方面有點搞不通的。今天用到了,順便寫下來,適當時候給C++初學者用用。c++
-----------C++二維數組動態申請內存--------------數組
若是對new和delete不是很瞭解的話能夠到這裏來看看,http://www.cnblogs.com/hazir/p/new_and_delete.htmlspa
首先,咱們通常須要用到數組的時候,都是直接聲明,好比:指針
1 int array[3][3];
可是,在某些狀況下,數組的維數咱們是不知道的,多是等待用戶輸入維數,這時候須要用變量來指定維數了。但是,咱們不能直接這樣聲明數組,由於C++不容許直接用變量做爲維數聲明,必須用常量,像這樣就會報編譯錯誤:code
這時候就須要用new來動態申請數組了。咱們一步一步來,申請一維數組的時候,咱們能夠這樣寫:htm
int num = 3; int* array = new int[num];
這段代碼的意思就是,用new來申請num個int類型的空間,而後返回那段空間的首地址,再賦給array。可見array是一個int類型的指針,指向那段空間的首地址。語法和邏輯無誤,正常運行。blog
可是,申請二維數組的時候,就可能要對指針這一知識點要掌握得比較好一點,理解得比較透徹。先貼代碼,再分析:內存
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的知識點!