Bài giảng Giới thiệu lập trình: Con trỏ cung cấp cho người học các kiến thức: Biến kiểu con trỏ, quản lý vùng nhớ, toán tử con trỏ, khai báo & sử dụng, các phép toán với con trỏ. Mời các bạn cùng tham khảo nội dung chi tiết.
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 2Khai báo & sử dụng
Các phép toán với con trỏ
Trang 3Truyề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
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)
0x22ff32
0x44ab12
p
10 v1
0x44ab12
Trang 90x44ab12
p
10 20 v1
0x44ab12
Trang 100x44ab12
p
10 v1
0x44ab12
0x22ff32
Trang 12Toán Tử new
Sử dụng toán tử new để tạo một vùng nhớ mới cho con trỏ, vùng nhớ này không có tên
int * p = new int;
Khởi tạo một vùng nhớ mới cho con trỏ p, giá trị tại vùng nhớ này không biết
int * p = new int(10);
Khởi tạo một vùng nhớ mới cho con trỏ p, giá trị tại vùng nhớ này được khởi tạo là 10
Trang 13? p2
Trang 14Toán Tử delete
Sử dụng toán tử delete để giải phóng vùng nhớ động được tạo ra bởi toán tử new
Lưu ý: chỉ giải phóng vùng nhớ được tạo ra bởi
new, không phải xóa biến con trỏ p
{
int * p = new int;
… … … delete p;
… … … }
Trang 15Toán Tử delete
Vùng nhớ động có thể được trả về bởi hàm
Vùng nhớ động chỉ được giải phóng khi sử
dụng delete, do đó vùng nhớ động tạo ra
trong hàm không bị xóa sau khi kết thúc hàm
Chỉ các biến khai báo trong hàm bị xóa, trong
đó có biến con trỏ p
int * f(int * q) {
int * p = new int;
… … … return p;
}
Trang 16Mảng Động
Biến mảng thực chất là biến con trỏ
Mảng thông thường (int a[10])
Độ dài mảng cố định
Không thể thay đổi độ dài sau khi khai báo
Có thể coi là con trỏ hằng (con trỏ tĩnh)
Mảng động (int * a = new int[10])
Độ dài mảng có thể thay đổi sau khi khai báo
Sử dụng lại toán tử new
int * a = new int[10];
Trang 17p chỉ tới địa chỉ mà a đang chỉ tới
Nhưng không được phép (lỗi dịch)
a = p;
a là hằng, không thay đổi giá trị của a
Trang 18Nhắc Lại: cstring & Lớp string
Trang 19Mảng Động
Hạn chế của mảng thông thường:
Phải khai báo độ dài trước
Độ dài mảng có thể không biết tới khi chạy chương trình
Phải ước lượng độ dài lớn nhất
Lãng phí bộ nhớ
Mảng động
Có thể tăng và giảm khi cần thiết
Trang 23Con Trỏ Trong C++
Con trỏ là khối kiến thức đặc biệt quan trọng trong C++
Phải nắm vững khái niệm con trỏ cũng như
thao tác với con trỏ
Con trỏ sẽ được sử dụng trong các kiểu dữ
liệu phức tạp
INT 2203 Cấu trúc Dữ liệu & Giải thuật