[Basic] Giới thiệu về con trỏ trong C++

Toán tử lấy địa chỉ (&)

Khi ta định nghĩa 1 biến, biến đó sẽ được tự động cấp phát 1 khối bộ nhớ để lưu trữ giá trị của biến đó. Ta có thế xem địa chỉ của biến thông qua toán tử (&)

Ví dụ:

#include <iostream>

int main()
{

   int x = 15;
 
   std::cout << "Gia tri bien x = " << x << std::endl;
 
   std::cout << "Dia chi luu tru bien x : " << &x << std::endl;

   return 0;
 
}

Kết quả:

Gia tri bien x = 15
Dia chi luu tru bien x : 0116FE40

Chú ý:

  • Địa chỉ của biến x được cấp phát tự động nên mỗi lần chạy chương trình có thể sẽ khác nhau.
  • Tránh nhầm lẫn toán tử lấy địa chỉ (&) vả toán tử AND (bitwise)
  1. Toán tử lấy địa chỉ là toán tử 1 ngôi (1 toán hạng) : &x
  2. Toán tử AND là toán tử 2 ngôi (2 toán hạng) : x & y

Toán tử dereference (*)

Ta có thể gán và lấy giá trị trực tiếp từ địa chỉ của biến thông qua toán tử dereference (*)

Ví dụ:

#include <iostream>

int main()
{
 
   int x = 15;
 
   std::cout << "Gia tri bien x = " << x << std::endl;
 
   std::cout << "Dia chi luu tru bien x : " << &x << std::endl;
 
   std::cout << "Gia tri tai dia chi bien x : " << *(&x) << std::endl;

   return 0;

}

Kết quả:

Gia tri bien x = 15
Dia chi luu tru bien x : 0135FA04
Gia tri tai dia chi bien x : 15

Chú ý:

Tránh nhầm lẫn giữa toán tử nhân và toán tử dereference

  • Toán tử dereference là toán tử 1 ngôi : *(&x);
  • Toán tử nhân là toán tử 2 ngôi : x * y

Con trỏ (Pointer)

Con trỏ là biến mà giá trị của nó là một địa chỉ trong bộ nhớ.

Khai báo con trỏ

Cú pháp:

kieu_du_lieu* ten_con_tro;

Ví dụ:

int* ptr;       //Khai báo con trỏ kiểu int

char* namePtr; // Khai báo con trỏ kiểu char

Chú ý:

Khi khái báo con trỏ vị trí đặt dấu * tùy thuộc vào phong cách viết code của mỗi người. Các cách viết sau đều hợp lệ.

int* ptr;

int * ptr;

int *ptr;

Gán giá trị cho con trỏ.

Cũng giống như các biến bình thường, trước khi sử dụng biến con trỏ ta phải gán giá trị cho nó.

Ví dụ

#include <iostream>

int main()
{
 
   int x = 15;
 
   int* ptr = &x; //Gán giá trị biến con trỏ bằng địa chỉ biến x
 
   std::cout << "Dia chi bien x : " << &x << endl;
 
   std::cout << "Gia tri con tro ptr : " << ptr << endl;

   return 0;

}

Kết quả:

Dia chi bien x : 00B3FC20
Gia tri con tro ptr : 00B3FC20

Vì con trỏ là biến chứa địa chỉ, để truy cập giá trị tại địa chỉ mà con trỏ trỏ tới ta dùng toán tử dereference (*)

Vi dụ

std::cout << "Gia tri tai dia chi con tro ptr tro toi: " << *ptr << endl;

Kết quả

Gia tri tai dia chi con tro ptr tro toi: 15

Lúc này *ptr và x có thể nói là tương đương nhau. Ta thay đổi 1 trong 2 cái thì cái còn lại cũng thay đổi theo.

Ví dụ

#include <iostream>
 
using namespace std;

int main()
{

   int x = 15;
 
   int* ptr = &x;
 
   *ptr = 20;
 
   cout << "Gia tri x = " << x << endl;
 
   return 0;
 
}

Kết quả:

Gia tri x = 20

Kích thước con trỏ

Kích thước con trỏ KHÔNG phục thuộc vào kiểu dữ liệu mà chỉ phụ thuộc vào kiến trúc CPU lúc ta cấu hình build. Nghĩa là với bất kỳ kiểu dữ liệu nào thì kích thước con trỏ cũng là như nhau.

  • x86 : sử dụng 32 bits để đánh địa chỉ, nên kích thước con trỏ là 32 bits (4 bytes)
  • x64 : sử dụng 64 bits để đánh địa chỉ, nên kích thước con trỏ là 64 bits (8 bytes)

Ví dụ:

#include <iostream>
 
using namespace std;

int main()
{
 
   cout << "Kich thuoc con tro char : " << sizeof(char*) << endl;
 
   cout << "Kich thuoc con tro int : " << sizeof(int*) << endl;
 
   cout << "Kich thuoc con tro float : " << sizeof(float*) << endl;
 
   cout << "Kich thuoc con tro double : " << sizeof(double*) << endl;
 
   return 0;
 
}

Kết quả :

x86
Kich thuoc con tro char : 4
Kich thuoc con tro int : 4
Kich thuoc con tro float : 4
Kich thuoc con tro double : 4

x64
Kich thuoc con tro char : 8
Kich thuoc con tro int : 8
Kich thuoc con tro float : 8
Kich thuoc con tro double : 8

Kích thước của con trỏ là như nhau, vậy kiểu dữ liệu (int, char…) khi khai báo con trỏ có ý nghĩa gì?

=> Đó là kiểu dữ liệu của giá trị tại đỉa chỉ mà biến đó trỏ vào.

Ví dụ

int x = 15;

int* ptr = &x;

=> Giá trị tại địa chỉ mà biến ptr trỏ vào có kiểu int.

Was this article helpful?

Leave A Comment?