Mảng 2D động thực chất là mảng các con trỏ, mỗi con trỏ trỏ đến một mảng 1D (hàng).
Các bước
- Cấp phát mảng con trỏ hàng:
int** a = new int*[rows]; - Với mỗi hàng, cấp phát mảng cột:
a[i] = new int[cols]; - Sử dụng như mảng 2D bình thường:
a[i][j] - Giải phóng ngược lại: xóa từng hàng, rồi xóa mảng con trỏ.
Ví dụ mã hoàn chỉnh
#include <iostream>
using namespace std;
int main() {
const int ROWS = 4, COLS = 5;
int** a = new int*[ROWS];
for (int i = 0; i < ROWS; ++i)
a[i] = new int[COLS];
// Khởi tạo
for (int i = 0; i < ROWS; ++i)
for (int j = 0; j < COLS; ++j)
a[i][j] = i;
// In
for (int i = 0; i < ROWS; ++i) {
for (int j = 0; j < COLS; ++j)
cout << a[i][j] << ' ';
cout << '\n';
}
// Giải phóng
for (int i = 0; i < ROWS; ++i)
delete [] a[i];
delete [] a;
return 0;
}
Kết quả
0 0 0 0 0 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3
Thay thế hiện đại: Dùng vector<vector<int>> matrix(rows, vector<int>(cols)) – tự động quản lý bộ nhớ, an toàn ngoại lệ.