Re: [問題] 要如何動態配置2維陣列?

看板C_and_CPP (C/C++)作者 (ㄚ德)時間18年前 (2006/11/14 19:06), 編輯推噓3(302)
留言5則, 5人參與, 最新討論串1/1
※ 引述《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
推一個很清楚! 竟然這麼有閒可以畫精美的圖 Orz
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
文章代碼(AID): #15MQD6c0 (C_and_CPP)
文章代碼(AID): #15MQD6c0 (C_and_CPP)