# Ôn tập về con trỏ trong C++
## Trình bày: Lê Minh Trí
## Ghi nhớ
> - Miền giá trị của một biến con trỏ là địa chỉ ô nhớ.
- **Cú pháp khai báo một con trỏ:**
> - KDL *<tên biến>;
- **Ví dụ:**
```cpp=
// a là biến con trỏ kiểu số nguyên.
// Miền giá trị của a là đại chỉ ô nhớ.
int *a;
```
- **Cách dùng con trỏ:**
- **Có 2 cách:**
- **Cách 1:** Sử dụng con trỏ để giữ địa chỉ một biến.
- **Cách 2:** Sử dụng con trỏ để xin cấp phát và thu hồi bộ nhớ.
- **Toán tử làm việc với con trỏ:**
- **Có 2 toán tử:**
- **Toán tử ***"&"*** (address-of operator):** dùng để lấy địa chỉ của một biến.
- **Toán tử** **"*"** **(dereference operator):** dùng để lấy giá trị hoặc cập nhật lại giá trị tại địa chỉ mà biến con trỏ đang giữ.
- **Cấp phát và thu hồi bộ nhớ:**
- **Cấp phát:** Để cấp phát bộ nhớ cho một biến con trỏ ta có thể sử dụng các hàm: **calloc, malloc, realloc** hoặc toán tử **new**.
- **Thu hồi:** Thu hồi bộ nhớ của biến con trỏ bằng hàm **free** hoặc toán tử **delete**.
- **Lưu ý:** Khi cấp phát bộ nhớ cho 1 biến con trỏ bằng toán tử **new** thì khi thu hồi bộ nhớ ta bắt buộc dùng toán tử **delete**.
- **Con trỏ cấu trúc:**
> - Để truy xuất đến một thành phần của biến con trỏ cấu trúc ta sử dụng toán tử mũi tên **"->"**.
- **Ví dụ cho dùng con trỏ để giữ địa chỉ của một biến hoặc mảng:**
```cpp=
// Khởi tạo biến con trỏ a có kiểu số nguyên.
int *a;
// Khởi tạo biến p có kiểu số nguyên.
int p;
// Khởi tạo mảng số nguyên p có 100 phần tử.
int b[100];
// Con trỏ a trỏ đến địa chỉ ô nhớ của biến p.
a = &p;
// Con trỏ a trỏ đến địa chỉ ô nhớ đầu tiên của mảng b (b[0]).
a = &b;
```
- **Ví dụ cho dùng con trỏ cấp phát và thu hồi bộ nhớ:**
```cpp=
// Khởi tạo biến con trỏ a có kiểu số nguyên và kích thức gấp 2 lần kiểu số nguyên.
int *a = new int[2];
// Thu hồi bộ nhớ của biến con trỏ a sau khi sử dụng xong:
delete []a;
//Khởi tạo biến con trỏ a có kiểu số nguyên và có giá trị tức thời là 2.
int *a = new int(2);
//Thu hồi bộ nhớ của biến con trỏ a sau khi sử dụng xong:
delete a;
```
- **Ví dụ truy cập một thành phần của biến con trỏ cấu trúc:**
```cpp=
//Khởi tạo kiểu cấu trúc con trỏ có 1 thành phần là biến kiểu số nguyên a.
struct ConTro
{
int a;
};
//Định nghĩa kiểu ConTro.
typedef struct ConTro CT;
int main()
{
//Khởi tạo biến con trỏ ct có kiểu là ConTro.
CT *ct;
//Truy cập thành phần *a của biến con trỏ ct bằng cách:
*ct->a = 6;
return 0;
}
```