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*)*類型的arrayfor(int i=0; i<num; ++i) {array[i] = new int[num]; // 分別給int*類型的數組申請空間,即一維數組的動態申請。}
? 現在我來解釋一下,其實我們可以把二維數組理解成為很多一維數組的集合。比如說:int array[4][3],其實它就是由4個長度為3的一維數組組成的。array[0]指的就是第一個一維數組??梢酝瞥?#xff0c;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;?
?
好吧!我已經盡量講得很詳細了!其實這段代碼不難,認真思考一下就行了??墒俏疫€是苦口婆心的很仔細的講了,可能為了以后和我一樣的菜鳥剛學指針時有緣看到這篇博客可以對他有些幫助吧,其實我已經對這個爛熟于心了,為什么還要這么仔細得寫呢?會不會浪費時間浪費精力?我不知道,可能再熟悉再小的問題,也可能會有自己不懂的學問在里面吧??傊?#xff0c;每篇博客,盡量寫到最好!
?
停筆!過幾天會更新關于new和delete的知識點!
轉載于:https://www.cnblogs.com/yuanxiaohui-blog/p/4837037.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的C++二维数组动态申请内存的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python3学习笔记(2)——递归函数
- 下一篇: SQL-left(right,inner