C/C++ 上陣列有兩個主要的特性:
1、配置存放陣列元素的記憶體(需要知道陣列『元素個數』還有『元素型態』才能實現)
2、提供 [] 運算子存取元素(知道陣列『第一個元素的位址』還有『元素型態』才能實現)
所以想要實作出陣列,需要知道『元素個數』、『元素型態』跟『第一個元素的位址』。
一般陣列(以int a[5]為例):
其中5是『元素個數』, int是『元素型態』, 而 a 可以轉型成 &a[0]表示『第一個元素的位址』。
動態一維陣列(int *a = new int[N]為例):
其中N是『元素個數』, int 是『元素型態』, 而 a 是『第一個元素的位址』。
動態二維陣列配置:
需要配置外圍陣列,以及內部陣列元素的記憶體空間,
int N = 5;
int M = 4;
int **b = new int *[N];
b是一個有N個元素的陣列,每個元素型態是 int *,也要對每一個 b[i] 配置記憶體跟儲存第一個元素位址,
for (int i = 0; i < N; ++i) {
b[i] = new int[M]; // b[i] 是一個有 M 個元素的陣列, 每個元素型態是 int}
}
動態二維陣列記憶體釋放:
同理在 delete 的時候也必須執行兩次 (順序要相反):
for (int i = 0; i < N; ++i) {
delete [] b[i];
}
delete [] b;
為了b[i] 指向的記憶體空間連續而增加效率:
int **b = new int*[N];
int *c = new int[N*M]; // 一次配置好所有 b[i] 用的空間
for (int i = 0; i < N; ++i) {
b[i] = c + i * M;
}
記憶體釋放的時候:
delete [] c;
delete [] b;
留言列表