Cách 1: Dùng con trỏ cấp 2
Ý tưởng: Để cấp phát động cho mảng 2 chiều, ta cấp phát bộ nhớ của từng chiều theo cú pháp của mảng một chiều. Tức là tạo m mảng 1 chiều, mỗi mảng có n phần tử.
Để làm điều này ta dùng 1 con trỏ cấp 2, cấp phát cho nó m con trỏ cấp 1, mỗi con trỏ cấp 1 ta lại cấp phát n phần tử.
Ví dụ:
1 2 3 | int **a = new int *[m]; for ( int i = 0; i<m; i++) a[i] = new int [n]; |
Với ví dụ trên, ta được một mảng động hai chiều các số nguyên có kích thước m x n.
Lưu ý là ta dùng một con trỏ cấp 2 cấp phát cho một mảng các phần tử có kiểu
int*
chứ không phải kiểu int thông thường. Kiểu int*
chính là con trỏ cấp 1.Để giải phóng bộ nhớ động, ta cũng phải giải phóng theo từng cột và từng hàng.
Ví dụ:
1 2 3 | for ( int i = 0; i<m; i++) delete []a[i]; delete []a; |
Cách 2: Dùng mảng 1 chiều để biểu diễn mảng 2 chiều
Ý tưởng: Cấp phát mảng 1 chiều có kích thước m x n và truy cập nó như một mảng 2 chiều với các chỉ số thông qua công thức liên hệ.
Phần tử a[i][j] tương ứng với phần tử a[i*n + j] trong mảng.
Ví dụ:
1 2 3 4 5 | int *a = new int [m*n]; //cấp phát xong //khởi tạo bằng 0 for ( int i = 0; i < m; i++) for ( int j = 0; j < n; j++) a[i*n+j] = 0; |
1 | delete []a; |
Với cách này bạn sẽ phải truy cập mảng 2 chiều thông qua công thức liên hệ, tuy nhiên, cách này sẽ hữu ích với những trường hợp như cộng 2 ma trận cùng loại, v.v...
0 nhận xét:
Đăng nhận xét