Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 25 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
25
Dung lượng
148,5 KB
Nội dung
1
Lập trình C++ 1
2
Con trỏ
1. Biến và con trỏ
2. Cấp phát và giải phóng bộ nhớ động
3. Mô hình bộ nhớ chương trình
4. Quan hệ giữa mảng và con trỏ
5. Phân biệt tham chiếu và contrỏ
6. Mảng con trỏ. Contrỏ cấu trúc. Contrỏ void
7. Contrỏ làm đối số trong hàm
8. Review
9. Bài tập
3
Biến và con trỏ
Khai báo
int a = 5; // a là biến chứa giá trị int
int *p; // p là contrỏ int, p là biến chứa địa chỉ
// của ô nhớ kiểu int
Truy nhập ô nhớ
p = &a; // toán tử & cho phép lấy địa chỉ của một biến,
// p chứa địa chỉ của biến a
*p = 7; // toán tử * cho phép truy nhập giá trị ô nhớ
// thông qua địa chỉ, giá trị của ô nhớ có địa
// chỉ trong p được gán giá trị 7
4
Biến và con trỏ
Mô tả:
1. int a = 5; // a là biến chứa giá trị int
2. int *p; // p là contrỏ int, p là biến chứa địa chỉ
3. p = &a; // p trỏ đến a
4. *p = 7; // gán giá trị qua p
a
1001
5
p
1100
1. Cấp ô
nhớ cho a
p
1100 1001
2. Cấp ô
nhớ cho p
a
1001
5
3. p chứa địa chỉ
của biến a
p
1100 1001
a
1001
7
4. gán giá trị vào ô
nhớ có địa chỉ trong p
5
Biến và con trỏ
Cho biết kết quả trên màn hình:
int a = 5;
int *p;
p = &a;
cout<< *p <<“\t”<< a <<endl;
*p = 8;
cout<< *p <<“\t”<< a <<endl;
a = 9;
cout<< *p <<“\t”<< a <<endl;
6
Cấp phát và giải phóng bộ nhớ động
Biến tĩnh
Là biến được cấp vùng nhớ ngay khi lời khai báo
được thực hiện
Tự động mất đi khi ra khỏi phạm vi khai báo
Biến tĩnh thường được sử dụng thông qua tên biến
Biến động
Là biến được cấp vùng nhớ bất kì khi nào chương
trình yêu cầu
Bị mất đi khi chương trình giải phóng vùng nhớ
Biến động thường được sử dụng thông qua con trỏ
7
Cấp phát và giải phóng bộ nhớ động
Toán tử new: Cấp phát vùng nhớ
int *p, *q, *r;
p = new int; // cấp phát ô nhớ cỡ int
q = new int(5); // cấp phát đồng thời khởi tạo giá trị
r = new int[8]; // cấp phát mảng động
Toán tử delete: Giải phóng vùng nhớ
delete p; // giải phóng vùng nhớ do p trỏ đến
delete[] r; // giải phóng mảng động
8
Cấp phát và giải phóng bộ nhớ động
Ví dụ:
// biến động
int *p = new int(5); // cấp phát ô nhớ
cout<< *p << endl;
delete p; // giải phóng ô nhớ
// mảng động
int *r = new int[7]; // cấp phát mảng động
for(int i = 0; i<7; i++)
{
r[i] = 3;
cout<<r[i]<<endl;
}
delete[ ] r; // giải phóng mảng động
9
Cấp phát và giải phóng bộ nhớ động
Chú ý: Khi giải phóng một vùng nhớ thì contrỏ
trỏ đến vùng nhớ đó vẫn chứa địa chỉ của vùng
nhớ, và như vậy việc truy nhập đến vùng nhớ đã
giải phóng là không hợp lệ (về logic).
=> Khi giải phóng vùng nhớ, nên gán tất cả contrỏtrỏ
đến vùng nhớ đó bằng NULL.
delete p; // giải phóng vùng nhớ do p trỏ đến
p = NULL; // p không chứa địa chỉ của vùng nhớ nào,
// p không trỏ đến vùng nhớ nào
Không giải phóng một vùng nhớ đã cấp phát sẽ
dẫn đến hiện tượng rò bộ nhớ (memory leak).
10
Cấp phát và giải phóng bộ nhớ động
Cho biết kết quả của đoạn chương trình sau:
int *p, *q;
p = new int(1);
q = new int(2);
cout<< *p <<"\t"<< *q <<endl;
*p = *q + 3;
cout<< *p <<"\t"<< *q <<endl;
p = q;
cout<< *p <<"\t"<< *q <<endl;
*p = 7;
cout<< *p <<"\t"<< *q <<endl;
p = new int;
delete p;
p = NULL;
q = NULL;
[...]... p . tham chiếu và con trỏ
6. Mảng con trỏ. Con trỏ cấu trúc. Con trỏ void
7. Con trỏ làm đối số trong hàm
8. Review
9. Bài tập
3
Biến và con trỏ
Khai báo
int. 1
Lập trình C++ 1
2
Con trỏ
1. Biến và con trỏ
2. Cấp phát và giải phóng bộ nhớ động
3. Mô hình bộ nhớ chương trình
4. Quan hệ giữa mảng và con trỏ
5.