Ôn tp vCon tr
Lp trình hướng đối tượng
@ 2004 Trn Minh Châu. FOTECH. VNU 2
Ôn tp con tr
nCp phát động (Dynamic Allocation)
new, delete
nCon trlc (Dangling pointers)
nRò rbnh(Memory leakage)
nCon trmng (Array Pointer)
nCác phép tính trên con tr(Pointer Arithmetic)
nCon trti bn ghi
nCp phát động mng
@ 2004 Trn Minh Châu. FOTECH. VNU 3
Con tr
Mt con trhay mt biến con trlà:
¤mt biến chiếuđến mt ô nh.
¤ lưu vtrí/địa chca ô nhớđó.
nHai ng dng chính:
¤Truy nhp gián tiếp
¤Bnhđộng
nVnđề kthut:
Nếu P làmt biến con tr
¤Làm thếnào để trPđến mt ô nhnào đó?
¤Làm thếnào để truy nhpđến ô nhP trđến?
int x = 361;
int *y = &x;
@ 2004 Trn Minh Châu. FOTECH. VNU 4
Thao tác con tr
nCác ký hiu, tkhóa: &, *, new, delete
int X, Y;
int* P;// P is an integer pointer variable
nLnh thhai khai báo mt biến con trP cógiátrchưa xác định nhưng
khác Null. Biến con try cóthchtrti mt ô nhcha mt snguyên
P = &Y;// trP ti Y (P lưuđịa chca Y)
*P = X; // ghi giátrca biến X vào vùng bnhtrbi 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ídtrên, X = 5, Y = 5, vàP trti X
@ 2004 Trn 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 Trn Minh Châu. FOTECH. VNU 6
Ký hiu
nĐọc*P biến màP trti
nĐọc&X địa chca X
n& toán tđịa ch(address of operator)
n* toán tthâm nhp(dereferencing operator)
nGisP1 = &X P2 = &Y, thì P1 trtiX P2 trtiY
P1 = P2
Khôngtương đương vi
*P1 = *P2
nP1 = P2 cóhiu qutrP1 tiY,lnh đó khôngthay đổiX
nLnh *P1 = *P2; tương đương viX = Y;
@ 2004 Trn Minh Châu. FOTECH. VNU 7
Sdng typedef
nLi hay gp khi sdng con tr. Phân bit hai dòng sau:
int* P, Q;// P is a pointer and Q an int
int *P, *Q;// P and Q are both pointers
nMt cách tránh li làsdng lnh typedef đđặt tên kiu mi. Víd:
typedef double distance; //distance is a new name for double
distance miles;
Ging như
double miles;
Cónghĩa rng, thay vìviết
int *P, *Q;
Ta cóthviết
typedef int* IntPtr;// new name for pointers to ints
IntPtr P, Q; //P and Q are both pointers
@ 2004 Trn Minh Châu. FOTECH. VNU 8
Cp phát bnhtĩnh động
(Static and Dynamic Allocation Of Memory)
Đon trình
int X,Y;// X and Y are integers
int *P;// P is an integer pointer variable
Cp phát bnhcho X, Y vàP ti thiđim biên dch
Đó cp phát tĩnh (static allocation)
nBnhcũng cóthđược cp phát ti thi gian chy. Đógi Cp
phát động (dynamic allocation). Víd:
P = new int;
¤Cp phát mt ô nhmi cóthcha mt snguyên, vàtrP ti ô nh
đó
@ 2004 Trn 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 Trn Minh Châu. FOTECH. VNU 1 0
Cp phát-thu hi bnhđộng
nheap: vùng bnhđặc bit dành riêng cho các biếnđộng. Để to mt biến
động mi, hthng cp phát không gian theap. Nếu không còn bnh,
new không thcp phát bnhthìnótrvgia trNull
nTrong lp trình thc th, ta nên luôn luôn kim tra li này
int *p;
p = new int;
if (p == NULL) {
cout << "Memory Allocation Error\n";
exit;
}
nThc ra, NULL làgiátr0, nhưng ta coi nólàmt giátrđặc bit vìcòn s
dng cho trường hpđặc bit: con tr"rng".