C++程式設計筆記:二維陣列的動態分配與釋放
阿新 • • 發佈:2019-01-04
當給定的條件不同時,二維陣列的動態分配方式不同。例如,已知二維陣列的行數(即第一維維度)為多少的情況下對其進行動態分配,與知道列數(第二維維度),或者兩個維度都未知的情況下,二維陣列的動態分配方式都不同,對應的釋放方式也不同。下面我們就來一一介紹。
1. 已知二維陣列的行數
const int ROW=3;//已知行數
int *a[ROW];//指標陣列
int col; //列數為未知,動態輸入
cin>>col;
//動態分配
for(int i=0;i<ROW;i++){
a[i]=new int[col];
/*輸入陣列元素
for (int j = 0; j < col; j++){
cin >> a[i][j];
}*/
}
/*列印陣列
for (int i = 0; i < M; i++){
for (int j = 0; j < col; j++){
cout << a[i][j] << " ";
}
cout << endl;
}
*/
//釋放
for(int i=0;i<ROW;i++){
delete[] a[i];
}
上述方法中指標指向的陣列在記憶體中並不一定是連續存放的,如果需要保持記憶體的連續性,則需要一次分配記憶體。
1.1 已知二維陣列的行數,一次分配記憶體(保持記憶體的連續性)
const int ROW=3;//已知行數
int *a[ROW];//指標陣列
int col; //列數為未知,動態輸入
cin<<col;
//動態分配
a[0]=new int[ROW*col];
for(int i=1;i<ROW;i++){
a[i]=a[i-1]+col;
}
//釋放
delete[] a[0];
2. 已知二維陣列的列數
const int COL=2;//已知列數
int (*a)[COL];//陣列指標
int row;//行數為未知,動態輸入
cin<<row;
//動態分配
a=new int[row][COL];
//釋放
delete[] a;
3. 未知二維陣列的行數和列數
int **a;//指標的指標
int row,col;//未知行數和列數,動態輸入
cin<<row<<col;
//動態分配
a=new int*[row];
for(int i=0;i<row;i++){
a[i]=new int[col];
}
//釋放
for(int i=0;i<row;i++){
delete[] a[i];
}
delete[] a;
同樣的,上述方法中指標指向的陣列在記憶體中也不一定是連續存放的,如果需要保持記憶體的連續性,則需要一次分配記憶體。
3.1 未知二維陣列的行數和列數,一次分配記憶體(保持記憶體的連續性)
int **a;//指標的指標
int row,col;//未知行數和列數,動態輸入
cin<<row<<col;
//動態分配
a=new int*[row];
a[0]=new int[row*col]
for(int i=1;i<row;i++){
a[i]=a[i-1]+col;
}
//釋放
delete[] a[0];
delete[] a;
特別注意一下,new和delete要配對使用,有多少個new就有多少個delete,且new和delete的形式保持一致,這樣才可以避免記憶體洩漏。