Trong ngôn ngữ lập trình C++, con trỏ không chỉ đơn giản là một biến mà còn là một công cụ quan trọng để điều khiển vùng nhớ.
Hãy cùng Mytour khám phá chi tiết về con trỏ trong C++ dưới đây.
Danh sách nội dung bài viết:
1. Khái niệm về con trỏ trong C++
2. Cách sử dụng con trỏ trong C++
3. Địa chỉ (address) trong C++
4. Biến con trỏ trong C++
5. Khai báo con trỏ trong C++
6. Các toán tử được sử dụng trong con trỏ
7. Ví dụ minh họa về con trỏ trong C++
8. Các vấn đề thường gặp khi làm việc với con trỏ trong C++
1. Con trỏ (pointer) trong ngôn ngữ lập trình C++
- Con trỏ trong C++ được dùng để truy xuất chuỗi, cây, ... và áp dụng cho mảng, cấu trúc, và hàm.
- Chúng ta có thể trả về nhiều giá trị từ hàm bằng cách sử dụng con trỏ.
- Được phép truy cập vào mọi vị trí trong bộ nhớ máy tính.
2. Ước lượng về việc sử dụng con trỏ trong C++
Trong lập trình C++, có nhiều cách để tận dụng con trỏ:
- Phân bổ bộ nhớ động: Trong C++, chúng ta có thể cấp phát bộ nhớ động bằng cách sử dụng các hàm malloc () và calloc (), trong đó con trỏ được sử dụng.
- Trong C++, con trỏ được sử dụng rộng rãi trong mảng, hàm và cấu trúc, giúp tối ưu hóa mã và cải thiện hiệu suất của chương trình.
3. Khái niệm về địa chỉ trong C++
Để hiểu về con trỏ, đầu tiên chúng ta cần biết cách dữ liệu được lưu trữ trong máy tính.
Mỗi biến mà bạn khai báo trong chương trình sẽ được gán một vị trí trong bộ nhớ máy tính. Giá trị thực sự của biến được lưu trữ tại vị trí này.
Để biết vị trí lưu trữ dữ liệu, C++ cung cấp toán tử & (tham chiếu), cho phép bạn lấy địa chỉ của một biến. Nếu var là biến, thì &var sẽ cung cấp địa chỉ của biến đó.
- Ví dụ: Dưới đây là một ví dụ minh họa về địa chỉ trong C++:
#bao gồm
sử dụng không gian tên std;
hàm chính()
{
số nguyên biến1 = 3;
số nguyên biến2 = 24;
xuất < &biến1=''><>
xuất < &biến2=''><>
xuất < &biến3=''><>
Kết thúc
Kết thúc
Đầu ra như sau:
0x7fff5fbff8ac
0x7fff5fbff8a8
0x7fff5fbff8a4
Chú ý:
- Kết quả trên máy của bạn có thể không tương tự như kết quả ở trên.
- 0x ở đầu biểu thị địa chỉ ở dạng hexa (cơ số 16).
- Ngoài ra, địa chỉ đầu tiên khác với địa chỉ thứ hai 4 byte và địa chỉ thứ hai khác với thứ ba 4 byte. Điều này là do kích thước của số nguyên (biến kiểu int) là 4 byte trong hệ thống 64 bit.
4. Biến con trỏ trong C++
Trong C++, người dùng có thể trực tiếp thao tác dữ liệu trong bộ nhớ máy tính. Có thể gán và hủy gán vùng nhớ bất kỳ theo ý muốn. Để thực hiện điều này, chúng ta sử dụng biến con trỏ.
Biến con trỏ là các biến trỏ đến một địa chỉ cụ thể trong bộ nhớ được chỉ định bởi một biến khác.
5. Khai báo con trỏ trong C++
Trong ngôn ngữ lập trình C++, con trỏ được khai báo bằng cách sử dụng ký hiệu * (dấu hoa thị).
int ∗ a; // con trỏ tới số nguyên
char ∗ c; // con trỏ tới ký tự
6. Các phép toán áp dụng trên con trỏ
Dưới đây là bảng liệt kê các phép toán áp dụng trên con trỏ trong ngôn ngữ lập trình C++:
Biểu tượng Tên Mô tả
& Toán tử Địa chỉ Cung cấp địa chỉ của một biến.
∗ Toán tử Giải thích Lấy giá trị từ một địa chỉ.
Trong trường hợp này, toán tử tham chiếu (&) được sử dụng để cung cấp địa chỉ của một biến. Để trích xuất giá trị lưu trữ tại địa chỉ bộ nhớ, chúng ta sử dụng toán tử (*).
Ví dụ, nếu biến kiểu số được lưu trữ tại địa chỉ bộ nhớ 0x123 và nó chứa giá trị là 5. Toán tử tham chiếu (&) cung cấp giá trị 0x123, trong khi toán tử trỏ đến (*) trả về giá trị 5.
Chú ý: Dấu (*) được sử dụng trong khai báo con trỏ C++ không phải là một con trỏ đến. Nó chỉ là một ký hiệu để tạo ra một con trỏ.
7. Ví dụ minh họa về con trỏ trong C++
Ví dụ 1:
Dưới đây là một ví dụ đơn giản về việc sử dụng con trỏ để in địa chỉ và giá trị:
#include
Sử dụng không gian tên std;
int main()
{
int số = 30;
int * con_trỏ;
con_trỏ = &số;//lưu trữ địa chỉ của biến số
cout << 'địa chỉ của biến số: ' << &số << endl;
cout << 'địa chỉ của con trỏ: ' << con_trỏ << endl;
cout << 'Địa chỉ của con trỏ: ' << p << endl;
return 0;
}
Đầu ra sẽ có dạng:
Địa chỉ của biến number: 0x7ffccc8724c4
Địa chỉ của con trỏ p: 0x7ffccc8724c4
Giá trị của con trỏ p: 30
Ví dụ 2:
Trong ví dụ sau đây, con trỏ thực hiện việc hoán đổi 2 số mà không cần sử dụng biến phụ:
#include
using namespace std;
int main()
{
int a=20,b=10,*p1=&a,*p2=&b;
cout<<'Trước khi hoán đổi: '<<*p1<<' '<<*p2< *p1=*p1+*p2; *p2=*p1-*p2; *p1=*p1-*p2; cout<<'Sau khi hoán đổi: '<<*p1<<' '<<*p2< return 0; } Kết quả xuất ra: Trước khi hoán đổi: ∗p1=20 ∗p2=10 Sau khi hoán đổi: ∗p1=10 ∗p2=20 Giả sử, nếu muốn con trỏ pc trỏ đến địa chỉ của c. Sau đó: int c, *pc; pc=&c; /* Sai! pc là con trỏ tới địa chỉ của c, cần sử dụng toán tử &. */ *pc=&c; /* Sai! *pc là giá trị được chỉ theo địa chỉ, còn %amp;c là một địa chỉ. */ pc=&c; /* Đúng! pc là địa chỉ, %amp;pc cũng là địa chỉ. */ *pc=c; /* Đúng! *pc là giá trị được chỉ theo địa chỉ, c là giá trị. */ Trong cả hai trường hợp, con trỏ pc không trỏ đến địa chỉ của c.8. Những sai lầm phổ biến khi làm việc với con trỏ trong C++
Bài viết trên đã giới thiệu về con trỏ (pointer) trong ngôn ngữ lập trình C++. Trong các bài viết tiếp theo, sẽ có sự giới thiệu về tham chiếu trong C++, một vấn đề mà nhiều lập trình viên quan tâm. Bài viết sẽ đi sâu vào các ví dụ và phân tích cụ thể.