← Danh sách bài học
👉
Con trỏ
Con trỏ lưu địa chỉ ô nhớ, cho phép truy cập trực tiếp phần cứng, cấp phát động, cấu trúc dữ liệu liên kết. Nguy hiểm nếu dùng sai (segfault, memory leak).
1. Cơ bản
& lấy địa chỉ, * dereference. int x = 5; int* p = &x; *p = 10; // x = 10. nullptr là con trỏ rỗng an toàn.
2. Cấp phát động
new/delete cấp phát trên heap; cần delete để tránh rò rỉ bộ nhớ.
int* p = new int(5);
int* arr = new int[100];
// ...
delete p;
delete[] arr;3. Smart pointer (C++11)
unique_ptr<T>: sở hữu duy nhất. shared_ptr<T>: đếm tham chiếu. Ưu tiên smart pointer hơn new/delete thô.
#include <memory>
auto p = make_unique<int>(42);
// tự động delete khi p ra khỏi scope4. Tham chiếu (reference)
int& r = x; là bí danh của x. Không thể null, không thể reseat. An toàn hơn con trỏ.
💻 Code mẫu thực chiến
Cấp phát mảng động theo n
Không biết n trước — cấp phát tại runtime.
int n; cin >> n;
int* a = new int[n];
for (int i = 0; i < n; i++) cin >> a[i];
// ... xử lý
delete[] a;Danh sách liên kết đơn — nút
Nền tảng cho stack, queue, hashmap tự cài.
struct Node {
int data;
Node* next;
Node(int x) : data(x), next(nullptr) {}
};
int main() {
Node* head = new Node(1);
head->next = new Node(2);
head->next->next = new Node(3);
for (Node* p = head; p; p = p->next) cout << p->data << " ";
}💡 Mẹo & lưu ý
- Mỗi new phải có delete đúng dạng (delete cho new, delete[] cho new[]).
- Không dereference nullptr — kiểm tra trước.
- Ưu tiên vector, string, smart pointer thay vì con trỏ thô.