[Basic] Con trỏ cấp 2 trong C++

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

 

Mô tả hoạt động con trỏ cấp 2

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

Was this article helpful?

Leave A Comment?