Con trỏ cấp 2 (pointer to pointer)
Con trỏ cấp 2 là con trỏ trỏ đến địa chỉa của 1 con trỏ khác.
Cú pháp:
kieu_du_lieu** ten_con_tro;
Con trỏ cấp 2 cũng làm việc như 1 con trỏ bình thường.
Ví dụ:
#include <iostream> using namespace std; int main() { int val = 20; cout << "Dia chi bien val = " << &val << endl; int* ptr = &val; // Con trỏ ptr trỏ vào địa chỉ biến val cout << "Dia chi bien ptr = " << &ptr << endl; cout << *ptr << endl; int** pptr = &ptr; // Con trỏ cấp 2 trỏ vào địa chỉ biến con trỏ ptr cout << **pptr << endl; return 0; }
Kết quả:
Dia chi bien val = 006FF8E4 Dia chi bien ptr = 006FF8D8 20 20

Cấp phát bộ nhớ con trỏ cấp 2
Để cấp phát bộ nhớ cho con trỏ cấp 2 ta cấp phát lần lượt bộ nhớ cho từng cấp.
- Cấp phát mảng các con trỏ.
- Cấp phát bộ nhớ cho từng phần tử trong mảng con trỏ.
Ví dụ
#include <iostream> using namespace std; int main() { int **matrix = nullptr; //Cấp phát mảng 10 phần tử là con trỏ matrix = new int*[10]; //Cấp phát bộ nhớ cho từng phần tử mảng trên for (int i = 0; i < 10; i++) { matrix[i] = new int[5]; } return 0; }
[Hinh mô tả]
Giải phóng bộ nhớ cấp phát động con trỏ cấp 2
Giải phóng bộ nhớ ta sẽ làm ngược lại lúc cấp phát:
- Giải phóng từng phần tử của mảng con trỏ
- Giải phóng mảng con trỏ
Ví dụ:
#include <iostream> using namespace std; int main() { int **matrix = nullptr; //Cấp phát mảng 10 phần tử là con trỏ matrix = new int*[10]; //Cấp phát bộ nhớ cho từng phần tử mảng trên for (int i = 0; i < 10; i++) { matrix[i] = new int[5]; } //Giải phóng từng phần tử trong mảng con trỏ for (int i = 0; i < 10; i++) { delete[] matrix[i]; } //Giải phóng mảng con trỏ delete[] matrix; return 0; }
Truy cập các phần tử của con trỏ cấp 2
Truy cập giống mảng 2 chiều
Ví dụ:
#include <iostream> using namespace std; int main() { int **matrix = nullptr; //Cấp phát mảng 10 phần tử là con trỏ matrix = new int*[6]; //Cấp phát bộ nhớ cho từng phần tử mảng trên for (int i = 0; i < 6; i++) { matrix[i] = new int[5]; } //Gán giá trị cho từng phần tử for (int i = 0; i < 6; i++) { for (int j = 0; j < 5; j++) { matrix[i][j] = i + j; } } //Xuất ra màn hình for (int i = 0; i < 6; i++) { for (int j = 0; j < 5; j++) { cout<< matrix[i][j] << " "; } cout << endl; } //Giải phóng từng phần tử trong mảng con trỏ for (int i = 0; i < 6; i++) { delete[] matrix[i]; } //Giải phóng mảng con trỏ delete[] matrix; return 0; }
Kết quả
0 1 2 3 4 1 2 3 4 5 2 3 4 5 6 3 4 5 6 7 4 5 6 7 8 5 6 7 8 9
Leave A Comment?