Mục tiêu của tiết học
Bạn sẽ học:
- Con trỏ (Pointer) là gì
- Cách khai báo và sử dụng con trỏ
- Dấu & và * có nghĩa gì
- Cấp phát bộ nhớ động (new, delete)
- Ứng dụng nhỏ: Quản lý mảng bằng con trỏ
1. Con trỏ là gì?
Con trỏ là một biến lưu địa chỉ của một biến khác trong bộ nhớ.
Ví dụ:
#include <iostream>
using namespace std;
int main() {
int x = 10;
int* p = &x; // con trỏ p lưu địa chỉ của x
cout << "Gia tri cua x: " << x << endl;
cout << "Dia chi cua x: " << &x << endl;
cout << "Gia tri cua con tro p: " << p << endl;
cout << "Gia tri tai dia chi p tro den: " << *p << endl;
}
- &x = địa chỉ của biến x
- int* p = con trỏ kiểu int
- *p = giá trị tại địa chỉ mà p trỏ tới
2. Thay đổi giá trị thông qua con trỏ
int x = 5;
int* p = &x;
*p = 20; // thay đổi giá trị của x thông qua con trỏ
cout << x; // In ra 20
3. Cấp phát bộ nhớ động
Khi bạn không biết cần bao nhiêu biến, bạn có thể tạo vùng nhớ khi chương trình đang chạy bằng new và xóa nó bằng delete.
int* p = new int; // cấp phát 1 vùng nhớ kiểu int
*p = 50;
cout << *p << endl; // In ra 50
delete p; // Giải phóng bộ nhớ
4. Con trỏ với mảng
int n = 3;int* arr = new int[n]; // tạo mảng động 3 phần tử
for (int i = 0; i < n; i++) {
arr = (i + 1) * 10;
}
for (int i = 0; i < n; i++) {
cout << arr << " ";
}
delete[] arr; // Giải phóng mảng
10 20 30
5. Tại sao con trỏ quan trọng?
- Giúp quản lý bộ nhớ hiệu quả
- Dùng để tạo cấu trúc dữ liệu phức tạp như danh sách liên kết, cây, đồ thị
- Dùng trong lập trình hệ thống, game engine, AI, IoT
- Là nền tảng để hiểu sâu về C++ hiện đại (smart pointers, memory leaks, references, v.v.)
Bài tập nâng cao
Tạo 1 chương trình:
- Hỏi người dùng muốn nhập bao nhiêu số
- Cấp phát động 1 mảng
- Cho người dùng nhập từng phần tử
- Tính trung bình của mảng
- In ra kết quả và giải phóng bộ nhớ sau khi xong
Gợi ý
Nếu bạn làm tốt phần này, bạn đã hiểu nền tảng để sau này làm game, AI hoặc mô phỏng vật lý bằng C++ rồi đấy
