C08: Reference & Pointer¶
Tác giả: FPTOJ Wiki
Chủ đề: Tham chiếu, con trỏ, truyền tham số
Bạn sẽ học được gì?¶
Sau bài này, bạn có thể:
- Hiểu Reference và Pointer trong C++
- Truyền tham trị, tham chiếu, con trỏ
- Trả về nhiều giá trị từ hàm
1. Reference — Tham chiếu¶
Reference là gì?¶
Reference là biệt danh (alias) cho một biến khác. Chúng trỏ cùng một vùng nhớ.
flowchart LR
subgraph "Vùng nhớ"
A["a = 10<br>Địa chỉ: 0x100"]
end
B["&b"] -->|"Tham chiếu"| A
Reference trong hàm¶
const Reference — Chỉ đọc¶
Luôn dùng const & cho object lớn
2. Pointer — Con trỏ¶
Con trỏ là gì?¶
Con trỏ là biến lưu địa chỉ của biến khác.
flowchart LR
subgraph "Stack"
A["a = 10<br>Địa chỉ: 0x100"]
B["p = 0x100<br>Địa chỉ: 0x200"]
end
B -->|"Trỏ đến"| A
| Toán tử | Ý nghĩa |
|---|---|
&a |
Lấy địa chỉ của a |
*p |
Lấy giá trị tại địa chỉ p (dereference) |
Con trỏ NULL¶
3. So sánh Reference vs Pointer¶
| Reference | Pointer | |
|---|---|---|
| Ký hiệu | int &r = a; |
int *p = &a; |
| NULL | Không được NULL | Có thể NULL |
| Thay đổi | Không thể đổi biến tham chiếu | Có thể đổi biến trỏ |
| Syntax | Dùng như biến thường | Cần * để dereference |
| Khuyến nghị | Ưu tiên dùng | Dùng khi cần |
4. Truyền tham số — 3 cách¶
flowchart TD
A["Gọi hàm"] --> B{"Cách truyền?"}
B -->|"Tham trị"| C["Copy giá trị<br>Không thay đổi gốc"]
B -->|"Tham chiếu"| D["Truyền địa chỉ<br>Thay đổi gốc"]
B -->|"Con trỏ"| E["Truyền con trỏ<br>Thay đổi gốc"]
Truyền tham trị (Pass by Value)¶
Truyền tham chiếu (Pass by Reference)¶
Truyền con trỏ (Pass by Pointer)¶
Chọn cách nào?
- Tham trị: Khi không cần thay đổi giá trị
- Tham chiếu: Ưu tiên khi cần thay đổi giá trị
- Con trỏ: Khi cần có thể NULL hoặc cần quản lý bộ nhớ
So sánh Python¶
5. Trả về nhiều giá trị¶
Cách 1: Dùng reference¶
Cách 2: Dùng pair/tuple¶
6. Bài tập thực hành¶
Bài 1: Hoán đổi 2 số¶
Viết hàm swap2 nhận 2 số nguyên và hoán đổi giá trị của chúng.
Lời giải
Bài 2: Tìm min và max¶
Viết hàm minMax nhận mảng và trả về min, max qua tham chiếu.
Lời giải
Bài 3: Pointer cơ bản¶
Đọc 2 số nguyên \(a\), \(b\). Dùng con trỏ để in giá trị lớn hơn.
Lời giải
Tóm tắt bài học¶
| Nội dung | Chi tiết |
|---|---|
| Reference | Biệt danh cho biến, int &r = a; |
| Pointer | Lưu địa chỉ, int *p = &a; |
| Tham trị | Copy giá trị, không thay đổi gốc |
| Tham chiếu | Truyền địa chỉ, thay đổi gốc |
| Con trỏ | Có thể NULL, cần * để dereference |
Bài viết liên quan¶
Bài trước: C07: Template & Fast I/O
Bài tiếp theo: C09: pair & tuple →