Re: [問題] 多維陣列傳遞的問題
int foo[3][2];
┌───┐
foo│ │
└─┼─┘
│
↓
[0][0] [0][1] [1][0] [1][1] [2][0] [2][1]
─┬───┬───┬───┬───┬───┬───┬─
... │ │ │ │ │ │ │ ...
─┴───┴───┴───┴───┴───┴───┴─
實際上還是一維陣列, 因為在電腦的管理上記憶體是一維的
所以在傳遞二維以上陣列時, 需要把除了第一維以外的長度都填上
因為它需要知道在哪裡要換行(列?)
而int** 則是像下列這樣
// in C++
int** foo = new int * [3];
for(int i=0 ; i< 3 ; i++ )
{
foo[i] = new int [2];
}
這樣也可以產生一個二維陣列 foo[3][2]
但是在記憶體配置上是不同的
┌─┐ [0] [1]
┌─┐ │ │ ┌───┬───┐
foo │ ┼──→ [0]│ ┼──→│ │ │
└─┘ │ │ └───┴───┘
├─┤ [0] [1]
│ │ ┌───┬───┐
[1]│ ┼──→│ │ │
│ │ └───┴───┘
├─┤ [0] [1]
│ │ ┌───┬───┐
[2]│ ┼──→│ │ │
│ │ └───┴───┘
└─┘
雖然這樣看起來就是二維的, 但是其實還是一維的,
也可以畫成
[0] [1] [2]
┌─┐ ┌──┬──┬──┐
foo │ ┼──→ │ │ │ │
└─┘ └─┼┴─┼┴─┼┘ [0] [1]
│ │ │ ┌───┬───┐
╰──┼──┼──→│ │ │
│ │ └───┴───┘
│ │ [0] [1]
│ │ ┌───┬───┐
╰──┼──→│ │ │
│ └───┴───┘
│ [0] [1]
│ ┌───┬───┐
╰──→│ │ │
└───┴───┘
像這樣宣告陣列時, 傳遞此陣列時就要寫成int** 而非int[][2]
更多維的就是以此類推, 更多指標指來指去...
要把這個陣列傳到一個函式, 該函式的原型(prototype)就要寫成
int fun(int** foo, int row, int col);
使用時則寫成 fun(foo,row,col); 即可
這樣宣告的陣列有幾個用途
因為new 或malloc出來的空間是在heap 所以不會因為函式結束而被清除
另外還有一個功用是可以在running time決定陣列大小
因為以前int foo[n];的方式, n必須要是個const
所以可以避開這個問題
另外多維陣列要傳入函式的話
必須宣告成
2x2x2為例
一般的多維陣列 void foo(int[][2][2] array); //除了第一維的長度都要寫
指標(動態)多維陣列 void foo(int*** array);
--
有錯煩請指正 <(_ _)>
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.142.131.134
※ 編輯: dendrobium 來自: 220.142.131.134 (12/24 21:16)
※ 編輯: dendrobium 來自: 220.142.131.134 (12/24 21:25)
推
12/25 01:19, , 1F
12/25 01:19, 1F
推
12/25 02:16, , 2F
12/25 02:16, 2F
推
12/25 09:14, , 3F
12/25 09:14, 3F
→
12/25 09:15, , 4F
12/25 09:15, 4F
推
12/25 12:00, , 5F
12/25 12:00, 5F
※ 編輯: dendrobium 來自: 220.142.133.37 (12/25 13:20)
推
12/25 23:01, , 6F
12/25 23:01, 6F
推
01/06 16:55, , 7F
01/06 16:55, 7F
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章