Re: [問題] 要如何動態配置2維陣列?
※ 引述《huangwh (香腸)》之銘言:
: ※ 引述《assyrian (喔耶)》之銘言:
: ------------------------------------------------
: : TYPE** array_2D = new TYPE*[n];
: : for(int i=0;i<n;i++){
: : array_2D[i]=new TYPE[n];
: : for(int j=0;j<n;j++){
: : ...
: : }
: : }
: -------------------------------------------------
: 不好意思
: 可以解釋一下嗎?
: TYPE** array_2D = new TYPE*[n];
: 謝謝
首先你要知道什麼指標。指標的「值」存的是記憶體的一個位置。所以在剛開始學
指標的時候常常可以看到這段code
int a=5;
int *b;
b=&a;
如此b的「值」是a在記憶體上的「位置」。如果我們輸出*b就可以輸出5,因為*是去
找指標所指到的那個位置(a在記憶體上的位置),然後把存在那個位置裡的東西拿出來
再來說到動態宣告陣列(以下都以int為例,其他date type亦同),那你要先知道陣
列是怎麼搞的。若我們一維陣列宣告為
int array1D[10];
表示在記憶體上開了連續十個sizeof(int)的空間給了array1D,陣列的名稱array1D
代表array1D在記憶體上開頭的位置(也就是array1D == &array1D == &array1D[0])。
所以我們可以寫
int *ptr1D;
ptr1D=array1D;
如此ptr1D的值就會是&array1D,我們也可以用ptr1D[2]來取array1D陣列裡的值了。
再來是二維陣列的宣告,若我們宣告
int array2D[30][10]
表示在記憶體上開了連續30*10也就是300個sizeof(int)的空間給array2D,你可以把
二維陣列想像成很多個一維陣列疊在一起(三維陣列也可想像成很多二維陣列疊在一起)
。對row major的compiler或語言而言(C語言陣列宣告即是),array2D就像是30個
array1D;也就是array2D[i] 都相當於一個array1D,0≦i<20。
所以我們可以把二維陣列看成一個特別的一維陣列,這個一維陣列每一「格」存的都
是「一維陣列」。
/ □-----→□□□□□□□□□□ 想像十格(一個array1D)塞在一個「特殊的
| □-----→□□□□□□□□□□ 一維陣列的一格中。
| □-----→□□□□□□□□□□
| □-----→□□□□□□□□□□
30 □-----→□□□□□□□□□□
列 .
| .
| .
\ □-----→□□□□□□□□□□
所以若我們要宣告一個指標來指二維陣列的話,要指的是一個特殊的一維陣列。(一
維陣列要用int *指我們已經知道了)但是這個一維陣列裡面的每一格又都是一個一維陣
列,所以現在我們要指的是int *,所以就用int **去指int * 。摁…好好體會一下= =
如果你array跟pointer的觀念都很好了,那上面就可以不用看了= =。回到正題
: : int** array2Dptr = new int*[30];
: : for(int i=0;i<30;i++){
: : array2Dptr[i]=new int[10];
: : }
以下以動態宣告30*10的int陣列為例
因為是動態宣告,你並沒有宣告,也就是沒有在記憶體上有配置空間給你要開的陣列
,因此在宣告了int **array2Dptr之後,你要new出int*[30]的空間來讓array2Dptr指,
也就是
array2Dptr
↘
/ □→
| □→
30 □→
| .
| .
\ □→
如圖所示,你可以看到array2Dptr[i]都沒有指到東西,因為你沒有給他空間啊!!所以
需要for那段code幫每個array2Dptr[i] new出int[10]大小的空間,這樣就會變成
array2Dptr
↘
/ □→□□□□□□□□□□
| □→□□□□□□□□□□
| □→□□□□□□□□□□
| □→□□□□□□□□□□
30 □→□□□□□□□□□□
列 .
| .
| .
\ □→□□□□□□□□□□
你就有空間可以用了啊!!!!
下台一鞠躬
初次po文請多包涵
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 218.166.48.211
推
11/14 20:50, , 1F
11/14 20:50, 1F
→
11/15 01:41, , 2F
11/15 01:41, 2F
→
12/16 00:08, , 3F
12/16 00:08, 3F
推
02/22 11:37, , 4F
02/22 11:37, 4F
推
05/15 16:03, , 5F
05/15 16:03, 5F
※ optimize:轉錄至看板 NTTU_CSIE99 11/21 13:01
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章