
Ôn tập vềCon trỏ
Lập trình hướng đối tượng
@ 2004 Trần Minh Châu. FOTECH. VNU 2
Ôn tập con trỏ
nCấp phát động (Dynamic Allocation)
new, delete
nCon trỏlạc (Dangling pointers)
nRò rỉbộnhớ(Memory leakage)
nCon trỏmảng (Array Pointer)
nCác phép tính trên con trỏ(Pointer Arithmetic)
nCon trỏtới bản ghi
nCấp phát động mảng

@ 2004 Trần Minh Châu. FOTECH. VNU 3
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ớđó.
nHai ứng dụng chính:
¤Truy nhập gián tiếp
¤Bộnhớđộng
nVấ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;
@ 2004 Trần Minh Châu. FOTECH. VNU 4
Thao tác con trỏ
nCác ký hiệu, từkhóa: &, *, new, delete
int X, Y;
int* P;// P is an integer pointer variable
nLệ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
nVí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

@ 2004 Trần Minh Châu. FOTECH. VNU 5
Vídụ
#include <iostream>
int main()
{ int x = 10; int y = 20;
int *p1, *p2;
p1 = &x;
p2 = &y;
cout << "x = " << x << endl;
cout << "y = " << y << endl;
cout << "*p1 = " << *p1 << endl;
cout << "*p2 = " << *p2 << endl << endl;
*p1 = 50;
*p2 = 90;
cout << "x = " << x << endl;
cout << "y = " << y << endl;
cout << "*p1 = " << *p1 << endl;
cout << "*p2 = " << *p2 << endl << endl;
p1 = p2;
cout << "x = " << x << endl;
cout << "y = " << y << endl;
cout << "*p1 = " << *p1 << endl;
cout << "*p2 = " << *p2 << endl << endl;
}
x = 10
y = 20
*p1 = 10
*p2 = 20
x = 50
y = 90
*p1 = 50
*p2 = 90
x = 50
y = 90
*p1 = 90
*p2 = 90
@ 2004 Trần Minh Châu. FOTECH. VNU 6
Ký hiệu
nĐọc*P là biến màP trỏtới
nĐọc&X là địa chỉcủa X
n&là toán tửđịa chỉ(address of operator)
n*là toán tửthâm nhập(dereferencing operator)
nGiảsửP1 = &X và P2 = &Y, thì P1 trỏtớiXvà P2 trỏtớiY
P1 = P2
Khôngtương đương với
*P1 = *P2
nP1 = P2 cóhiệu quảtrỏP1 tớiY,lệnh đó khôngthay đổiX
nLệnh *P1 = *P2; tương đương vớiX = Y;

@ 2004 Trần Minh Châu. FOTECH. VNU 7
Sửdụng typedef
nLỗi hay gặp khi sửdụng con trỏ. Phân biệt hai dòng sau:
int* P, Q;// P is a pointer and Q an int
int *P, *Q;// P and Q are both pointers
nMột cách tránh lỗi làsửdụng lệnh typedef đểđặt tên kiểu mới. Vídụ:
typedef double distance; //distance is a new name for double
distance miles;
Giống như
double miles;
Cónghĩa rằng, thay vìviết
int *P, *Q;
Ta cóthểviết
typedef int* IntPtr;// new name for pointers to ints
IntPtr P, Q; //P and Q are both pointers
@ 2004 Trần Minh Châu. FOTECH. VNU 8
Cấp phát bộnhớtĩnh và động
(Static and Dynamic Allocation Of Memory)
Đoạn trình
int X,Y;// X and Y are integers
int *P;// P is an integer pointer variable
Cấp phát bộnhớcho X, Y vàP tại thờiđiểm biên dịch
Đólà cấp phát tĩnh (static allocation)
nBộnhớcũng cóthểđược cấp phát tại thời gian chạy. Đógọi là Cấp
phát động (dynamic allocation). Vídụ:
P = new int;
¤Cấp phát một ô nhớmới cóthểchứa một sốnguyên, vàtrỏP tới ô nhớ
đó

@ 2004 Trần Minh Châu. FOTECH. VNU 9
Vídụ
//Program to demonstrate pointers
//and dynamic variables
#include <iostream>
int main()
{
int *p1, *p2;
p1 = new int;
*p1 = 10;
p2 = p1;
cout << "*p1 = " << *p1 << endl;
cout << "*p2 = " << *p2 << endl << endl;
*p2 = 30;
cout << "*p1 = " << *p1 << endl;
cout << "*p2 = " << *p2 << endl << endl;
p1 = new int;
*p1 = 40;
cout << "*p1 = " << *p1 << endl;
cout << "*p2 = " << *p2 << endl << endl;
}
*p1 = 10
*p2 = 10
*p1 = 30
*p2 = 30
*p1 = 40
*p2 = 30
@ 2004 Trần Minh Châu. FOTECH. VNU 1 0
Cấp phát-thu hồi bộnhớđộng
nheap: vùng bộnhớđặc biệt dành riêng cho các biếnđộng. Để tạo một biến
động mới, hệthống cấp phát không gian từheap. Nếu không còn bộnhớ,
new không thểcấp phát bộnhớthìnótrảvềgia trịNull
nTrong lập trình thực thụ, ta nên luôn luôn kiểm tra lỗi này
int *p;
p = new int;
if (p == NULL) {
cout << "Memory Allocation Error\n";
exit;
}
nThực ra, NULL làgiátrị0, nhưng ta coi nólàmột giátrịđặc biệt vìcòn sử
dụng cho trường hợpđặc biệt: con trỏ"rỗng".