Re: [問題] 另一種方式的動態配置二維陣列…

看板C_and_CPP作者 (鬼翼&娃娃魚)時間16年前 (2009/06/22 14:57), 編輯推噓1(101)
留言2則, 1人參與, 最新討論串2/3 (看更多)
※ 引述《ychch (GG)》之銘言: : → ychch:感謝你的解釋…雖然看不太懂…但我會在想看看@@ 06/22 22:32 唉~~小弟我不太擅長在BBS上畫圖, 本來實在很懶得回的....Orz 傳統new一個二維陣列的作法大概如下.... int W = 16, H = 16; char **p = new char*[H]; for(int i=0; i<H; ++i) p[i] = new char[W]; for(int i=0; i<H; ++i) delete []p[i]; delete []p; 這樣做的問題是, 你的p[][]陣列有可能是不連續的.... 連不連續依運用未必是要考慮的問題, 我只是先提一個可能性.... 下面用一張簡圖表示, 因為小弟實在不擅長BBS畫圖.... p: |---- ---- ---- ----| | | | +---> p[3]: |---- ----| | | +---> p[2]: |---- ----| | +---> p[1]: |---- ----| +---> p[0]: |---- ----| 用一個一維陣列模擬二維陣列的作法大概如下.... char **p = new char*[H]; char *raw = new char[W*H]; for(int i=0; i<H; ++i) p[i] = &raw[i*W]; delete []p; delete []raw; 這樣做, 至少可以保證你的p[][]也就是raw[]是連續的.... 還方便一點, 不需要空間關係的循序操作您可以對raw[]直接做.... 而它的記憶體分布情形大概簡圖如下.... p: |---- ---- ---- ----| | | | | | | | +--------------+ | | | | | | +---------+ | | | | | | +----+ | | | | | | raw:|---- ---- ---- ---- ---- ---- ---- ----| 而您找到的那種寫法, 恕小弟不再貼code了.... 它的簡圖大概像這樣, 我畫一畫意思有到就行了.... 因為有交叉太麻煩畫了, 請您自己試著連連看吧.... 連完您就知道理論上沒有空間被浪費掉的.... p: | (這一段放p[i]) (這一段相當於上面的raw) | |---- ---- ---- ----|---- ---- ---- ---- ---- ---- ---- ----| | | 最後一個寫法比前一個稍微好一點的地方是.... 它只需要new/delete一次, 所有空間都是連續的.... 想用二維陣列的操作模式就直接用p[i][j].... 想用一維模式就存取p[H]以後的範圍, 當然可能要加個轉型.... 或者乾脆另外用一個變數 char *P = (char*)p[H]; 這樣:) -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 58.41.18.64 ※ 編輯: VictorTom 來自: 58.41.18.64 (06/22 23:00)

06/23 00:51, , 1F
推詳細說明
06/23 00:51, 1F

06/23 00:51, , 2F
不過這方法遇到物件時不管用,要特別小心
06/23 00:51, 2F
文章代碼(AID): #1AFvltqI (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1AFvltqI (C_and_CPP)