Bài giảng Lập trình hướng đối tượng - Ôn tập về con trỏ
Cấp phát động (Dynamic Allocation)
new, delete
Con trỏ lạc (Dangling pointers)
Rò rỉ bộ nhớ (Memory leakage)
Con trỏ mảng (Array Pointer)
Các phép tính trên con trỏ (Pointer Arithmetic)
Con trỏ tới bản ghi
Cấp phát động mảng
Ôn tập về Con trỏ Lập trình hướng đối tượng Ôn tập con trỏ Cấp phát động (Dynamic Allocation) new, delete Con trỏ lạc (Dangling pointers) Rò rỉ bộ nhớ (Memory leakage) Con trỏ mảng (Array Pointer) Các phép tính trên con trỏ (Pointer Arithmetic) Con trỏ tới bản ghi Cấp phát động mảng Con trỏ Một con trỏ hay một biến con trỏ là: một biến chiếu đến một ô nhớ. nó lưu vị trí/địa chỉ của ô nhớ đó. Hai ứng dụng chính: Truy nhập gián tiếp Bộ nhớ động Vấn đề kỹ thuật: Nếu P là một biến con trỏ Làm thế nào để trỏ P đến một ô nhớ nào đó? Làm thế nào để truy nhập đến ô nhớ P trỏ đến? int x = 361; int *y = &x; Thao tác con trỏ Các ký hiệu, từ khóa: &, *, new, delete int X, Y; int* P; // P is an integer pointer variable Lệnh thứ hai khai báo một biến con trỏ P có giá trị chưa xác định nhưng khác Null. Biến con trỏ này có thể chỉ trỏ tới một ô nhớ chứa một số nguyên P = &Y; // trỏ P tới Y (P lưu địa chỉ của Y) *P = X; // ghi giá trị của biến X vào vùng bộ nhớ trỏ bởi P Ví dụ Y = 5; // variable Y stores value P = &X; // P points to memory location of X *P = Y; // same as writing X = Y Sau ví dụ trên, X = 5, Y = 5, và P trỏ tới X Ví dụ #include int main() { int x = 10; int y = 20; int *p1, *p2; p1 = &x; p2 = &y; cout int main() { int *p1, *p2; p1 = new int; *p1 = 10; p2 = p1; cout class IQ { private: char name[20]; int score; public: IQ (const char s, int k) { strcpy(name, s); score = k; } void smarter(int k) { score += k;} void print() const { cout #include "iq1.h" int main() { IQ *x = new IQ("Newton",200); IQ *y = new IQ("Einstein",250); x->print(); y->print(); return; } Mảng cấp phát động new T[n] cấp phát một mảng gồm n đối tượng kiểu T và trả về một con trỏ tới đầu mảng delete [] p huỷ mảng mà p trỏ tới và trả vùng bộ nhớ đó cho heap. P phải trỏ tới đầu mảng động, Nếu không, kết quả của delete sẽ phụ thuộc vào trình biên dịch và loại dữ liệu đang sử dụng. Ta có thể nhận được lỗi runtime error hoặc kết quả sai. Kích thước của mảng động không cần là hằng số mà có thể có giá trị được quyết định tại thời gian chạy #include int main () { int size; cin int main () { int* A = new int[6]; // dynamically allocate array A[0] = 0; A[1] = 1; A[2] = 2; A[3] = 3; A[4] = 4; A[5] = 5; int *p = A + 2; cout << "A[1] = " << A[1] << endl; delete [] p; // illegal!!! // results depend on particular compiler cout << "A[1] = " << A[1] << endl; } Cấp phát động mảng đa chiều Cấp phát động mảng hai chiều (N+1)(M+1) gồm các đối tượng IQ: IQ **a = new (IQ*) [N+1]; for (int i=0; i<N+1; i++) a[i] = new IQ[M+1];
File đính kèm:
- Bài giảng Lập trình hướng đối tượng - Ôn tập về con trỏ.ppt