Xem mẫu
- KỸ THUẬT LẬP TRÌNH C
BÀI 7: CON TRỎ VÀ CẤP PHÁT BỘ NHỚ ĐỘNG
Hoàng Quốc Tuấn
tuanhq@fpt.edu.vn
http://hoangquoctuanpro.wordpress.com
- Nội dung
Con trỏ và địa chỉ
Cấp phát và giải phóng bộ nhớ động
2
- I – Con trỏ và địa chỉ
1. Toán tử địa chỉ
2. Con trỏ
3. Quy tắc sử dụng con trỏ
3
- 1 – Toán tử địa chỉ
Các khái niệm liên quan đến biến
Địa chỉ của biến
Khái niệm
Phân loại địa chỉ biến
Phép lấy địa chỉ của một biến
4
- 1.1 – Các khái niệm liên quan đến biến
Liên quan đến biến có ba khái niệm:
Tên biến
Kiểu biến
Giá trị của biến
Ví dụ:
int a = 15 ;
Kiểu biến Tên biến Giá trị của biến
5
- 1.2 – Địa chỉ của biến
Khái niệm
Khi khai báo “int a = 15;”
− Máy sẽ cấp phát cho biến a một khoảng nhớ
gồm 2 bytes liên tiếp (kích thước kiểu int là 2
bytes).
− Địa chỉ của biến là số thứ tự của byte đầu tiên
được cấp cho biến.
6
- 1.2 – Địa chỉ của biến
Phân loại địa chỉ biến
− Địa chỉ của hai biến kiểu int liên tiếp cách
nhau 2 bytes.
− Địa chỉ của hai biến kiểu float liên tiếp
cách nhau 4 bytes.
Địa chỉ kiểu int, địa chỉ kiểu float, địa
chỉ kiểu double,...
7
- 1.2 – Địa chỉ của biến
Phép lấy địa chỉ của một biến
− Toán tử một ngôi & cho ta địa chỉ của một
đối tượng.
− Phép toán & chỉ áp dụng cho các đối tượng
trong bộ nhớ, đó là các biến và các phần tử
mảng.
− Toán tử & không áp dụng cho các biểu
thức, các hằng và các biến có kiểu register
(các biến này chứa trong thanh ghi của CPU).
8
- 2 – Con trỏ
Khái niệm biến con trỏ
Phân loại con trỏ
Khai báo biến con trỏ
Hằng con trỏ
9
- 2.1 – Khái niệm biến con trỏ
Con trỏ là một loại biến dùng để lưu
địa chỉ
Mỗi loại địa chỉ sẽ có một kiểu con trỏ
tương ứng (phụ thuộc vào loại dữ liệu
lưu trữ trong địa chỉ đó)
10
- 2.2 – Phân loại con trỏ
Tùy thuộc vào kiểu biến mà con trỏ trỏ
đến, ta phân loại được các con trỏ.
Con trỏ kiểu int chứa địa chỉ các biến
kiểu int, con trỏ kiểu float chứa địa chỉ
của các biến kiểu float,...
11
- 2.3 – Khai báo biến con trỏ
Con trỏ không kiểu
− Con trỏ không kiểu có thể chứa bất kỳ
một địa chỉ nào.
− Cú pháp:
void *tên_biến_con_trỏ;
− Ví dụ:
void *p, *q;
12
- 2.3 – Khai báo biến con trỏ
Con trỏ có kiểu
− Con trỏ có kiểu chỉ chứa những địa chỉ
của loại dữ liệu phù hợp với kiểu dữ liệu
mà ta đã khai báo cho con trỏ.
− Cú pháp:
kiểu_dữ_liệu *tên_biến_con_trỏ;
− Ví dụ:
int *p, *q;
float *x; 13
- 2.4 – Hằng con trỏ
Đối với các biến, từ khóa const dùng để khai báo
và khởi đầu giá trị cho các biến mà sau này giá
trị của nó không được phép thay đổi bởi các
lệnh trong chương trình. Chúng được gọi là các
đối tượng hằng.
Đối với con trỏ, từ khóa const được dùng để khai
báo các đối số con trỏ mà trong thân hàm ta
không được phép thay đổi giá trị các đối tượng
được trỏ bởi các đối tượng này.
14
- 2.4 – Hằng con trỏ
Ví dụ 1:
#include
void main()
{
const int a = 10;
a++; // sai, khong duoc thay doi bien const a
printf(“\n a = %d”, a);
}
15
- 2.4 – Hằng con trỏ
Ví dụ 2:
void thu_nghiem(const int *stt)
{
*stt = *stt + 1;
// Sai, khong duoc thay doi gia tri cua bien
// dang duoc tro boi con tro stt
}
16
- 3 – Quy tắc sử dụng con trỏ
Tên con trỏ
Các phép toán trên con trỏ
Toán tử *
17
- 3.1 – Tên con trỏ
Tên con trỏ được đặt theo quy tắc đặt tên
định danh.
Ví dụ:
float a, *p, *q;
p = &a; /* con trỏ p trỏ đến địa chỉ
biến a */
q = p; /* con trỏ q trỏ đến địa chỉ mà
con trỏ p đang trỏ đến*/
18
- 3.2 - Các phép toán trên con trỏ
Phép gán
Phép tăng giảm địa chỉ
Phép so sánh
Toán tử *
19
- 3.2 - Các phép toán trên con trỏ
Phép gán
− Chỉ nên thực hiện phép gán cho các con trỏ cùng kiểu.
− Ví dụ:
int x = 1, *pi, *qi;
pi = &x;
qi = pi;
− Kết quả các câu lệnh trên là con trỏ pi và qi đều trỏ
đến địa chỉ của biến x.
20
nguon tai.lieu . vn