[Con trỏ - Pointer] Con trỏ trong C++ tuy khó học nhưng khá thú vị. Một vài tác vụ trong ngôn ngữ C++ được thực hiện dễ dàng và linh hoạt hơn nhờ con trỏ, như trong việc cấp phát bộ nhớ, không thể thực hiện mà không dùng con trỏ. Do đó việc nắm vững con trỏ là cần thiết khi học C++ để trở thành lập trình viên cứng.
Như bạn biết, mỗi biến trong một vùng nhớ nhất định và mỗi vùng nhớ này có địa chỉ có nó được định nghĩa để dễ dàng trong việc truy cập sử dụng toán tử (&) tương ứng với địa chỉ của nó trong bộ nhớ. Xem xét ví dụ dưới đây, sẽ in ra địa chỉ của biến được định nghĩa:
#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
Con trỏ là gì?
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:
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++ và ten_bien là tên giá trị của con trỏ. Phần ký tự * sử dụng trong khai báo con trỏ giống như việc bạn sử dụng cho phép nhân. Mặc dù vậy, trong khai báo này, ký tự * được thiết kế để sử dụng các biến của con trỏ. Dưới đây là một số cách khai báo hợp lệ của 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ự
Kiểu dữ liệu thực sự của giá trị của tất cả các con trỏ, có thể là integer, float, character, hoặc kiểu khác, là giống như, một số long hexa biểu diễn một địa chỉ bộ nhớ. Điểm khác nhau duy nhất của các con trỏ của các kiểu dữ liệu khác nhau là kiểu dữ liệu của biến hoặc hằng số mà con trỏ chỉ tới.
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.
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.
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:
Dưới đây là cách sử dụng những phép toán trên:
#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
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:
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.
Chi tiết về con trỏ trong C++
Con trỏ có nhiều khái niệm nhưng cũng khá dễ để học và rất quan trọng trong lập trình ngôn ngữ C++. Dưới đây là những khái niệm quan trọng về con trỏ trong C /C++, được trình bày rõ ràng cho bạn, khi bạn click vào link tương ứng.
Khái niệm | Mô tả |
---|---|
Ngôn ngữ lập trình C++ hỗ trợ con trỏ null, là một hằng số với giá trị là 0 được định nghĩa trong một số thư viện chuẩn. | |
Có 4 toán tử số học mà có thể được sử dụng trên các con trỏ là: ++, --, +, - | |
Mối liên hệ giữa con trỏ và mảng trong C++. | |
Bạn có thể định nghĩa các mảng để lưu trữ các con trỏ. | |
Ngôn ngữ lập trình C++ cho phép bạn trỏ tới một con trỏ ... | |
Truyền một tham số bởi tham chiếu hoặc địa chỉ: cả hai cho các tham số được truyền khả năng có thể được thay đổi trong hàm gọi bởi hàm được gọi. | |
Ngôn ngữ lập trình C++ cho phép một hàm trả về một con trỏ tới biến địa phương (local), biến tĩnh và cũng như bộ nhớ được cấp phát động. |