看書的時候看到二維陣列動態宣告這個方式,例程如下:
int **a = new int* [m];
for (int i = 0; i < m; i++)
a[i] = new int[n];
對指標的指標呼叫不是很理解,於是在網上查了一下,發現下面這種講解比較通俗易懂;
下面三種定義形式怎麼理解?怎麼動態分配空間?
(1)、int **ptr;
(2)、int *ptr[ 5 ]; 我更喜歡寫成 int* prt[5];
(3)、int ( *ptr )[ 5 ];
它們本身都是指標,它們的最終內容都是整數。注意我這裡說的是最終內容,而不是中間內容,比如你寫 ptr[ 0 ],對於三者來說,其內容都是乙個整數指標,即 int *;ptr[ 1 ][ 1 ] 這樣的形式才是其最終內容。
(1)、int **ptr 表示指向"一群"指向整數的指標的指標。
(2)、int *ptr[ 5 ] 表示指向 5 個指向整數的指標的指標,或者說ptr有5個指向"一群"整數的指標,ptr是這5個指標構成的陣列的位址
(3)、int ( *ptr )[ 5 ] 表示指向"一群"指向 5 個整數陣列的指標的指標。
(1)、int **ptr 和 (3)、int ( *ptr )[ 5 ] 一樣,在32位平台裡,都是4位元組,即乙個指標。
(2)、int *ptr[ 5 ] 不同,它是 5 個指標,它佔5 * 4 = 20 個位元組的記憶體空間。
(1)、int **ptr
因為是指標的指標,需要兩次記憶體分配才能使用其最終內容。首先,ptr = ( int ** )new int *[ 5 ];這樣分配好了以後,它和(2)的意義相同了;然後要分別對 5 個指標進行記憶體分配,例如:ptr[ 0 ] = new int[ 20 ];它表示為第 0 個指標分配 20 個整數,分配好以後, ptr[ 0 ] 為指向 20 個整數的陣列。這時可以使用下標用法 ptr[ 0 ][ 0 ] 到ptr[ 0 ][ 19 ] 了。如果沒有第一次記憶體分配,該 ptr 是個"野"指標,是不能使用的,如果沒有第二次記憶體分配,則 ptr[ 0 ] 等也是個"野"指標,也是不能用的。
(2)、int *ptr[ 5 ]
這樣定義的話,編譯器已經為它分配了 5 個指標的空間,這相當於(1)中的第一次記憶體分配。根據對(1)的討論可知,顯然要對其進行一次記憶體分配的。否則就是"野"指標。
(3)、int ( *ptr )[ 5 ]
它的意義是"一群"指標,每個指標都是指向乙個 5 個整數的陣列。如果想分配 k 個指標,這樣寫: ptr = ( int ( * )[ 5 ] ) new int[ 5 * k ]。這是一次性的記憶體分配。分配好以後,ptr 指向一片連續的位址空間,其中 ptr[ 0 ] 指向第 0 個 5 個整數陣列的首位址,ptr[ 1 ] 指向第1 個 5 個整數陣列的首位址。
二維陣列傳參與動態宣告詳解
二維陣列在棧上分配,各行位址空間連續 定義的時候,擁有兩種形式 第一種是指明行數和列數 int array 3 3 第二種是不指明第一維,而指明第二維 int array 3 而在子函式宣告的時候,有三種方式一種是指明形參的行數和列數 int func int array 3 int m,int n...
二維動態陣列
之前都是寫的小程式,一直用的靜態陣列,也沒出現問題。可是,最近碰到大型程式和工程,這時就要用動態陣列了。因為靜態陣列時儲存在棧中的,而動態陣列儲存在堆中。計算機的棧只有1m大小,而堆可以理論上達到計算機記憶體大小,可見當大型工程資料量非常大時,必須使用動態陣列了。c 的動態陣列的建立和刪除要用到ne...
動態建立二維陣列
c 中用new動態建立二維陣列的格式一般是這樣 type p n new type n 其中,type是某種型別,n是二維陣列的列數。採用這種格式,列數必須指出,而行數無需指定。在這裡,p的型別是type n 即是指向乙個有n列元素陣列的指標。還有一種方法,可以不指定陣列的列數 int p p ne...