[r]
Trang 1Giới Thiệu Lập Trình
Con Trỏ
TS Lê Nguyên Khôi Trường Đại học Công nghệ, ĐHQGHN
Trang 2Nội Dung
Con trỏ
Biến kiểu con trỏ
Quản lý vùng nhớ
Toán tử con trỏ
Mảng động
Khai báo & sử dụng
Các phép toán với con trỏ
Trang 3Giới Thiệu
Định nghĩa:
Địa chỉ vùng nhớ máy tính của một biến
Vùng nhớ máy tính
Chia nhỏ thành các byte
Đánh số thứ tự lần lượt (hệ 16)
Địa chỉ được sử dụng làm tên cho biến
Con trỏ đã sử dụng
Truyền tham số theo kiểu tham chiếu
Địa chỉ của tham số được truyền
Trang 4Biến Con Trỏ
Con trỏ là “kiểu dữ liệu”
Kiểu địa chỉ vùng nhớ
Có thể dùng biến để lưu giá trị kiểu con trỏ
Không phải kiểu int, double
Địa chỉ của vùng nhớ dùng lưu dữ liệu kiểu
int, double
Ví dụ: double * p;
Khai báo p là biến kiểu con trỏ double
Lưu địa chỉ vùng nhớ kiểu double
Trang 5Biến Con Trỏ – Khai Báo
Khai báo con trỏ giống biến kiểu dữ liệu khác
Thêm * vào trước tên biến
Ký hiệu * phải đặt trước mỗi biến con trỏ
Ví dụ: int *p1, *p2, v1, v2;
p1, p2 biến kiểu con trỏ int
v1, v2 biến kiểu int
Sử dụng p1, p2 lưu địa chỉ các biến kiểu int
Sử dụng p1, p2 lưu địa chỉ của v1, v2
Trang 6Địa Chỉ & Số Nguyên
Con trỏ là địa chỉ
Địa chỉ là số nguyên
Con trỏ KHÔNG là số nguyên
C++ ép con trỏ phải được sử dụng như địa chỉ
Không thể được sử dụng như số nguyên
Mặc dù đó là số nguyên!!!
Trang 7Toán Tử &
Toán tử & trả về địa chỉ của biến
Dòng 4: đặt biến con trỏ p chỉ tới biến v1
p bằng địa chỉ của v1
Dòng 5: đặt biến con trỏ p chỉ tới biến v2
1 {
2 int *p, v1, v2;
3 v1 = 10; v2 = 20;
4 p = &v1;
5 p = &v2;
p
20 v2
0x22ff32
0x44ab12
p
10 v1
0x44ab12
Trang 8Toán Tử *
Toán tử * truy xuất giá trị của vùng nhớ được quản lý (lưu) bởi con trỏ
Dòng 4: in ra 10 (giá trị biến v1, mà p chỉ tới) Dòng 6: in ra 20 (giá trị biến v2, mà p chỉ tới)
1 {
2 int *p, v1, v2;
3 v1 = 10; p = &v1;
4 cout << *p;
5 v2 = 20; p = &v2;
6 cout << *p;
7 }
0x22ff32
p
20 v2
0x22ff32
0x44ab12
p
10 v1
0x44ab12
Trang 9Toán Tử =
Gán giá trị
Dòng 3, 4: p chỉ tới v1, q chỉ tới v2
Dòng 5: sử dụng toán tử * truy cập vùng tới nhớ con trỏ quản lý
*p là v1, *q là v2, dòng 5 tương đương v1 = v2;
1 {
2 int v1 = 10, v2 = 20;
3 int *p = &v1;
4 int *p = &v2;
5 *p = *q;
q
20 v2
0x22ff32
0x44ab12
p
10 20 v1
0x44ab12
Trang 10Toán Tử =
Gán con trỏ
Dòng 3, 4: p chỉ tới v1, q chỉ tới v2
Dòng 5: gán p bằng q
p không quản lý v1
p và q cùng quản lý v2
1 {
2 int v1 = 10, v2 = 20;
3 int *p = &v1;
4 int *p = &v2;
5 p = q;
q
20 v2
0x22ff32
0x44ab12
p
10 v1
0x44ab12
0x22ff32