C 二維陣列動態申請記憶體

2021-08-28 19:40:46 字數 1629 閱讀 1609

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

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

-----------c++二維陣列動態申請記憶體--------------

如果對new和delete不是很了解的話可以到這裡來看看,

首先,我們一般需要用到陣列的時候,都是直接宣告,比如:

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看完這段**,還是有點糊塗的。為什麼array是int**型別?為什麼還要用迴圈來分配空間?我們再來看下面注釋版的**:

int num = 3;

(int*)* array = new int*[num]; // 申請int*型別陣列的記憶體空間,賦值給(int*)*型別的array

for(int i=0; i

現在我來解釋一下,其實我們可以把二維陣列理解成為很多一維陣列的集合。比如說: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好吧!我已經盡量講得很詳細了!其實這段**不難,認真思考一下就行了。可是我還是苦口婆心的很仔細的講了,可能為了以後和我一樣的菜鳥剛學指標時有緣看到這篇部落格可以對他有些幫助吧,其實我已經對這個爛熟於心了,為什麼還要這麼仔細得寫呢?會不會浪費時間浪費精力?我不知道,可能再熟悉再小的問題,也可能會有自己不懂的學問在裡面吧。總之,每篇部落格,盡量寫到最好!

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

C 動態申請二維陣列

剛學習,做下總結。以下是我的理解,如有錯誤歡迎指出。申請 int a 乙個指向指標的指標。int n m cin n m a new int n 申請乙個n個元素的一維陣列 作為行 for int i 0 i 關係如下假設 n 3 m 4 先申請乙個一維陣列,陣列的每個元素都是乙個指標變數 該陣列的...

C 中動態申請二維陣列

這裡主要介紹c 中動態申請二維陣列的兩種方式,直接給出 很容易明白,簡單的作為乙個筆記。include include 輸入輸出操縱 include using namespace std 法一 new 方式申請 void dynamicarray for i 0 i rows i cout end...

C語言動態申請一維陣列 二維陣列

首先 新增 include include int a int n scanf d n a int malloc n sizeof int free a 這樣就動態分配了陣列a n 陣列的長度n可輸入確定,也可用程式中的變數確定。但要注意程式結束後要用free 將其釋放,否則記憶體會洩漏。驗證一下 ...