← 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 scope

4. 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ô.