Con trỏ trong C++


1. Khái niệm

Một con trỏ là một biến mà trong đó giá trị của nó là địa chỉ của biến khác. Ví dụ như địa chỉ của vùng nhớ. Giống như các biến và hằng số, bạn phải khai báo con trỏ trước khi bạn có thể sử dụng nó để lưu trữ bất kì địa chỉ của biến nào. Dạng tổng quát của việc khai báo con trỏ như sau:

VD

#include <iostream>

using namespace std;

int main ()

{

   int  bien1;

   char bien2[10];

 

   cout << "Dia chi cua bien1 la: ";

   cout << &bien1 << endl;

 

   cout << "Dia chi cua bien2 la: ";

   cout << &bien2 << endl;

 

   return 0;

}

Kết quả:

Dia chi cua bien1 la: 0x6ffe4c
Dia chi cua bien2 la: 0x6ffe40

2. Khai báo con trỏ

kieu_du_lieu *ten_bien;

Trong đó:

kieu_du_lieu là kiểu dữ liệu cơ bản con trỏ, nó là kiểu hợp lệ trong ngôn ngữ C++

- ten_bien là tên giá trị của con trỏ.

- Phần ký tự * sử dụng trong khai báo con trỏ  là bắt buộc. Ký tự này để quy định biến đó là con trỏ

int    *ip;    // trỏ tới một số int

double *dp;    // trỏ tới một số double

float  *fp;    // trỏ tới một số float

char   *ch     // trở tới một ký tự

 

3. Cách sử dụng con trỏ trong C++

Con trỏ được sử dụng theo hai cách:

  • Dùng con trỏ để lưu địa chỉ của biến để thao tác.
  • Lấy giá trị của biến do con trỏ trỏ đến để thao tác.

3.1. Dùng con trỏ để lưu địa chỉ của biến

Bản thân con trỏ sẽ được trỏ vào địa chỉ của một biến có cùng kiểu dữ liệu với nó. Cú pháp của phép gán như sau:

<ten_con_tro> = &<ten_bien>;

Trong phép toán này, tên con trỏ không có dấu “*”. Ví dụ:

int x, *ip;

ip = &x;

con trỏ px có kiểu int trỏ vào địa chỉ của biến x có kiểu nguyên. Phép toán &<ten_bien> sẽ cho địa chỉ của biến tương ứng.

3.2. Lấy giá trị của biến do con trỏ trỏ đến

Phép lấy giá trị của biến do con trỏ trỏ đến được thực hiện bằng cách gọi tên:

*<ten_con_tro>;

Trong phép toán này, phải có dấu con trỏ “*”. Nếu không có dấu con trỏ, sẽ trở thành phép lấy địa chỉ của biến do con trỏ trỏ tới. Ví dụ:

int x = 12, y, *ip;

ip = &y;

*px = x;

Quá trình trên diễn ra như sau:

Sử dụng con trỏ trong C++

4. Ví dụ

#include <iostream>

using namespace std;

int main () {

   int  x = 20, y;    // khai bao bien binh thuong

   int  *ip;          // bien con tro

   ip = &y;

   *ip = x;           // dia chi luu tru cua bien con tro

 

   // in dia chi luu tru cua bien con tro ip

   cout << "Dia chi luu tru cua bien con tro ip: ";

   cout << ip << endl;

 

   // gia tri cua dia chi o nho cua con tro

   cout << "Gia tri cua bien *ip: ";

   cout << *ip << endl;

    

   // gia tri cua bien x

   cout << "Gia tri cua bien x: ";

   cout << x << endl;

    

   // gia tri cua bien y

   cout << "Gia tri cua bien y: ";

   cout << y << endl;

 

   return 0;

}

Kết quả:

Dia chi luu tru cua bien con tro ip: 0x6ffe3c
Gia tri cua bien *ip: 20
Gia tri cua bien x: 20
Gia tri cua bien y: 20

5. Phép gán giữa các con trỏ

Các con trỏ cùng kiểu có thể gán cho nhau thông qua phép gán và lấy địa chỉ con trỏ:

<ten_con_tro_1> = <ten_con_tro_2>

Trong phép gán giữa các con trỏ, bắt buộc phải dùng phép lấy địa chỉ của biến do con trỏ trỏ tới (không có dấu “*” trong tên con trỏ) mà không được dùng phép lấy giá trị của biến do con trỏ trỏ tới.

Hai con trỏ phải cùng kiểu. Trong trường hợp hai con trỏ khác kiểu, phải sử dụng các phương thức ép kiểu tương tự như trong phép gán các biến thông thường có kiểu khác nhau.

Ví dụ:

int x = 20, *px, *py;

px = &x;

py = px;

Quá trình diễn ra như sau:

Sử dụng con trỏ trong C++

con trỏ py cũng trỏ vào địa chỉ của biến x như con trỏ px. Khi đó *py cũng có giá trị 12 giống như *px và là giá trị của biến x.


XEM THÊM: Con trỏ và mảng trong C++