You are on page 1of 58

Bi 10: Con tr v Mng ng

Ging vin: Hong Th ip


Khoa Cng ngh Thng tin H Cng Ngh

Chapter 10
Pointers and
Dynamic Arrays

Copyright 2010 Pearson Addison-Wesley.


All rights reserved

Mc tiu bi hc
Con tr
Bin con tr
Qun l b nh

Mng ng

To v s dng
S hc con tr

Lp, con tr, mng ng

S dng con tr this


Hm hy, hm kin to sao chp

DTH

INT2202

Gii thiu con tr


nh ngha con tr:
a ch nh ca mt bin
Nhc li: b nh c chia thnh
Cc vng nh nh s
a ch c dng nh tn ca bin
Trc bi ny ta s dng con tr!
Tham s truyn bng tham chiu
a ch ca i s thc s s c truyn vo
hm

DTH

INT2202

Bin con tr
Con tr c nh kiu
C th lu con tr trong bin
Khng phi bin int, double, ...
m l con tr ti int, double,

V d:
double *p;
Khai bo p l bin kiu con tr ti double
N c th lu gi tr con tr ti bin double
Khng lu c con tr ti cc kiu khc!

DTH

INT2202

Khai bo bin con tr


Khai bo bin con tr nh nhng kiu c sn
Thm * trc tn bin
To ra con tr ti kiu
* phi nm trc mi bin
int *p1, *p2, v1, v2;
p1, p2 lu con tr ti bin int
v1, v2 l bin int thng thng

DTH

INT2202

a ch v gi tr s
Con tr l mt a ch
a ch l mt s nguyn
Con tr khng phi l mt s nguyn!
C++ bt buc s dng con tr nh a ch
Khng th dng n nh gi tr s
Mc d n thc cht l mt gi tr s

DTH

INT2202

Tr
V mt thut ng
Ta t p trung vo ti vic tr ch khng phi bn thn
a ch
Bin con tr tr ti bin thng
B qua bn lun v a ch
Khin vic trc quan ha r rng hn
Thy" tham chiu ti vng nh
Mi tn

DTH

INT2202

Tr
int *p1, *p2, v1, v2;
p1 = &v1;
Ch nh con tr p1 tr ti bin int v1

Ton t &

Xc nh a ch ca bin

Cch c:

"p1 bng a ch ca v1"


Hoc "p1 tr ti v1"

DTH

INT2202

Tr
V d:
int *p1, *p2, v1, v2;
p1 = &v1;

C 2 cch lm vic vi v1:


Dng chnh bin v1:
cout << v1;
Thng qua con tr p1:
cout << *p1;

Ton t dereference *

Dch Anh-Vit: gii tham chiu / tham chiu ngc / kh tham


chiu
S gii tham chiu cho bin con tr
Ngha l Ly d liu m p1 tr ti

DTH

INT2202

V d: Tr
Xt on m:
v1 = 0;
p1 = &v1;
*p1 = 42;
cout << v1 << endl;
cout << *p1 << endl;

Kt qu:
42
42
*p1 v v1 l mt bin

DTH

INT2202

Ton t &
L ton t ly a ch
Cng dng ch nh tham s truyn bng tham chiu
Khng phi l trng hp ngu nhin!
Nhc li: truyn tham chiu thc cht truyn a ch
ca i s thc s vo hm
2 cch dng ton t ny c lin h mt thit

DTH

INT2202

Gn con tr
C th gn bin con tr:
int *p1, *p2;
p2 = p1;
Gn mt con tr cho con tr khc
Ch nh p2 tr ti ni m p1 ang tr ti"
D b ln vi:
*p2 = *p1;
Gn gi tr tr bi p1 cho gi tr tr bi p2

DTH

INT2202

Minh ha php gn con tr:


Display 10.1 Dng php gn trn cc bin con tr

DTH

INT2202

Ton t new
V con tr c th tham chiu ti bin
Khng thc s cn phi c nh danh chun cho bin

C th cp pht ng cho bin


Ton t new to ra bin
Khng c nh danh cho n
Ch c mt con tr

p1 = new int;
To ra mt bin khng tn v gn p1 tr ti n
C th lm vic vi bin thng qua *p1
Dng nh bin thng

DTH

INT2202

V d thao thc c bn trn con tr:


Display 10.2 Thao tc c bn trn con tr (1/2)

DTH

INT2202

V d thao thc c bn trn con tr:


Display 10.2 Thao tc c bn trn con tr (2/2)

DTH

INT2202

Hnh minh ha
thao tc c bn
trn con tr:
Display 10.3
Gii thch
Display 10.2

DTH

INT2202

Bn thm v ton t new


To ra mt bin cp pht ng mi
Tr v con tr ti bin mi ny
Nu kiu ca n nh ngha bi lp:
Hm kin to s c gi
C th gi hm kin to khc khi c i s khi to:
MyClass *mcPtr;
mcPtr = new MyClass(32.0, 17);

Vn c th khi to kiu c bn:


int *n;
n = new int(17);

DTH

//Khi to *n bng 17

INT2202

Con tr v hm
Con tr l kiu d liu hon chnh
C th dng n nh cc kiu khc

N c th l tham s ca hm
C th l kiu tr v ca hm
V d:
int* findOtherPointer(int* p);
Hm ny khai bo:
C tham s kiu con tr tr ti int
Tr v bin con tr tr ti int

DTH

INT2202

Qun l b nh
Heap
Cn c gi l "freestore"
Dnh ring cho cc bin cp pht ng
Tt c cc bin cp pht ng mi u c t trong freestore
Nu nhiu qu chim ton b vng nh freestore

Nu freestore y, cc php ton new sau s


tht bi.

DTH

INT2202

Kim tra new thnh cng


Trnh bin dch c:
Kim tra xem li gi new c tr v null hay khng:
int *p;
p = new int;
if (p == NULL)
{
cout << "Error: Khong du bo nho.\n";
exit(1);
}
Vi on m trn, nu new thnh cng, chng trnh
s tip tc

DTH

INT2202

new thnh cng trong trnh bin dch mi


Trnh bin dch mi hn:
Nu php ton new tht bi:
Chng trnh s t ng kt thc
Sinh thng bo li
B sung kim tra NULL vn l k nng thc hnh tt

DTH

INT2202

Kch thc ca freestore


Thay i ty ci t
Thng l ln
Hu ht cc chng trnh khng dng ht vng nh
ny
Qun l b nh
Vn l k nng thc hnh tt
Nguyn l bt buc ca k ngh phn mm
B nh lun hu hn
D c nhiu ti u

DTH

INT2202

Ton t delete
Gii phng b nh ng
Khi khng cn cn na
Tr li vng nh cho freestore
V d:
int *p;
p = new int(5);
// X l g
delete p;

Gii phng b nh ng tr bi con tr p


Thc cht l hy vng nh

DTH

INT2202

Con tr lc
delete p;
Hy vng nh ng
Nhng p vn tr ti !
Gi l con tr lc

Nu sau gii tham chiu trn p ( *p )


Kt qu khng lng trc c!
Thng l nguy him!

Hy trnh con tr lc

Gn con tr bng NULL sau khi delete:


delete p;
p = NULL;

DTH

INT2202

Bin cp pht ng v bin t ng


Bin cp pht ng

Sinh ra bi ton t new


Sinh ra v hy i khi chng trnh ang chy

Bin cc b

Khai bo bn trong nh ngha hm


Khng ng
Sinh ra khi hm c gi
Hy i khi hm kt thc

Thng gi l bin t ng

Cc thuc tnh c trnh bin dch qun l t ng

DTH

INT2202

Bin C++ v Qun l b nh

DTH

INT2202

Bin C++ v Qun l b nh


a ch trn

ngn xp

(h thng, bin mi trng, bin t ng)

th vin dng chung

(cc hm th vin nu dng lin kt ng)

heap

(cp pht/gii phng b nh ng bng


new/delete)

d liu

(bin ton cc, bin static khi to)

vn bn

(m ngun dch )
a ch di

DTH

INT2202

nh ngha kiu d liu con tr


C th t tn cho kiu d liu con tr
c th khai bo bin con tr nh cc bin khc
Loi b * trong khai bo con tr

typedef int* IntPtr;


nh ngha mt tn khc cho kiu d liu con tr
Cc khai bo sau:
IntPtr p;
int *p;
l tng ng

DTH

INT2202

Li thng gp:
Tham s con tr truyn gi tr
Hot ng tinh vi v phin h
Nu hm bin i tham s con tr th ch bn sao ca
n b bin i
V d minh ha

DTH

INT2202

V d tham s con tr truyn gi tr:


Display 10.4 Tham s con tr truyn gi tr (1/2)

DTH

INT2202

V d tham s con tr truyn gi tr:


Display 10.4 Tham s con tr truyn gi tr (2/2)

DTH

INT2202

Hnh minh ha tham s con tr truyn gi tr:


Display 10.5 Li gi ti sneaky(p);

DTH

INT2202

Mng ng
Bin mng
Thc ra l bin con tr
Mng chun
Kch thc c nh
Mng ng
Kch thc khng xc nh thi im lp trnh
M xc nh khi chy chng trnh

DTH

INT2202

Bin mng
Nhc li: mng lu trong cc nh lin tip
Bin mng tham chiu ti phn t u tin
Suy ra bin mng l mt kiu bin con tr!

V d:
int a[10];
int * p;
a v p u l bin con tr!

DTH

INT2202

Bin mng Con tr


V d trc:
int a[10];
typedef int* IntPtr;
IntPtr p;
a v p l cc bin con tr
C th thc hin gn:
p = a;
// Hp l
p by gi s tr ti ni a tr
Tc l ti phn t u tin ca mng a
a = p;
// Khng hp l
Con tr mng l con tr hng!

DTH

INT2202

Bin mng Con tr


Bin mng
int a[10];
Khng ch l mt bin con tr

N c kiu "const int *"


Mng c cp pht trong b nh
Bin a phi lun tr ti !
Khng thay i c

Ngc vi con tr thng


C th v thng bin i

DTH

INT2202

Mng ng
Hn ch ca mng chun
Phi ch nh kch thc
Thc t ta c th khng bit kch thc trc khi
chy chng trnh!
Phi c lng kch thc ti a c th cn n
i khi n, i khi khng
Lng ph b nh
Mng ng
C th dn hay co khi cn

DTH

INT2202

To mng ng
Rt n gin!
Dng ton t new

Cp pht ng cho bin con tr


Sau dng n nh mng chun

V d:
typedef double * DoublePtr;
DoublePtr d;
d = new double[10]; // kch thc trong cp ngoc vung
To bin mng cp pht ng d c 10 phn t, kiu c s l
double

DTH

INT2202

Xa mng ng
Cp pht ng khi chy chng trnh
th nn c hy khi chy chng trnh

Thao tc xa rt n gin. V d:
d = new double[10];
//Processing
delete [] d;
Gii phng tt c vng nh ca mng ng ny
Cp ngoc vung bo hiu c mng
Nhc li: d vn tr ti vng nh !
Sau khi delete, cn gn d = NULL;

DTH

INT2202

Hm tr v mt mng
Ta khng c php tr v kiu mng trong hm
V d:
int [] someFunction(); // Khng hp l!
C th thay bng tr v con tr ti mng c cng kiu c
s:
int* someFunction(); // Hp l!

DTH

INT2202

S hc con tr
C th thc hin cc php ton s hc trn con tr
S hc a ch

V d:
typedef double* DoublePtr;
DoublePtr d;
d = new double[10];
d cha a ch ca d[0]
d + 1 bng a ch ca d[1]
d + 2 bng a ch ca d[2]

Tng ng vi a ch ca cc phn t

DTH

INT2202

Cch khc thao tc mng


Dng s hc con tr
Duyt mng m khng dng ton t [] truy cp ch s:
for (int i = 0; i < arraySize; i++)
cout << *(d + i) << " " ;

Tng ng:
for (int i = 0; i < arraySize; i++)
cout << d[i] << " " ;

Ch c php cng/tr trn con tr


Khng c nhn, chia

C th t tng ++ v t gim -- con tr

DTH

INT2202

Mng ng nhiu chiu


L mng ca mng
S dng nh ngha kiu con tr gip hiu r hn:
typedef int* IntArrayPtr;
IntArrayPtr *m = new IntArrayPtr[3];
To ra mng 3 con tr
Sau bin mi con tr ny thnh mng 4 bin int

for (int i = 0; i < 3; i++)


m[i] = new int[4];
Kt qu l mng ng 3 x 4

DTH

INT2202

Lp
Ton t ->

K hiu vit tt

Kt hp ton t gii tham chiu * v ton t chm


Ch nh thnh vin ca lp c tr bi con tr cho
trc
V d:
MyClass *p;
p = new MyClass;
p->grade = "A"; // Tng ng vi:
(*p).grade = "A";

DTH

INT2202

Con tr this
Trong nh ngha hm thnh vin i khi ta cn tham
chiu n chnh i tng ang gi ti n
Dng con tr this c sn
T ng tr ti i tng ang gi:
class Simple
{
public:
void showStuff() const;
private:
int stuff;
};

C 2 cch truy cp cho hm thnh vin:


cout << stuff;
cout << this->stuff;

DTH

INT2202

Np chng ton t gn
Ton t gn tr v tham chiu
c th c nhiu php gn ni nhau
V d: a = b = c;
Gn a v b bng c
Ton t phi tr v cng kiu v tri n
c th gn ni nhau
Con tr this s hu ch trong trng hp ny

DTH

INT2202

Np chng ton t gn
Nhc li: Ton t gn phi l thnh vin ca lp
N c 1 tham s
V tri l i tng gi ti ton t
s1 = s2;
C th ngh n l: s1.=(s2);

s1 = s2 = s3;
Cn c (s1 = s2) = s3;
Do (s1 = s2) phi tr v i tng c kiu nh s1
Ri truyn = s3 vo;

DTH

INT2202

StringClass

DTH

INT2202

nh ngha ton t = np chng


V d cho lp StringClass:
StringClass& StringClass::operator=(const StringClass& rtSide)
{
if (this == &rtSide)
// nu v phi ging ht v tri
return *this;
else
{
capacity = rtSide.length;
length = rtSide.length;
delete [] a;
a = new char[capacity];
for (int i = 0; i < length; i++)
a[i] = rtSide.a[i];
return *this;
}
}
DTH

INT2202

Sao chp nng v su


Sao chp nng
Php gn ch sao chp ni dung ca cc bin thnh vin
Php gn mc nh v hm kin to sao chp mc nh

Sao chp su
Khi lin quan ti con tr v cp pht ng
Phi gii tham chiu bin con tr ri sao chp vng d liu c
con tr tr ti
Hy t np chng ton t gn v hm kin to sao chp nu
gp trng hp ny!

DTH

INT2202

Hm hy
Cc bin cp pht ng
Khng bin mt nu khng c delete tng minh
Nu con tr l d liu thnh vin private
Chng cp pht ng d liu thc
Trong hm kin to
Phi c cch no gii phng vng nh khi i
tng b hy
Cu tr li: Vit hm hy.

DTH

INT2202

Hm hy
Ngc li vi hm kin to
c gi t ng khi i tng ra ngoi phm vi hot ng
Phin bn mc nh ch xa cc bin thng, khng xa cc
bin ng

nh ngha nh hm kin to, thm du ng ~


MyClass::~MyClass()
{
//Thc hin cng tc dn dp
}

DTH

INT2202

Hm kin to sao chp

T ng gi khi:

1. Khai bo i tng thuc lp ng thi khi to n bng i


tng khc
2. Khi hm tr v i tng thuc lp
3. Khi i s c kiu ca lp c truyn gi tr vo hm

Cn bn sao tm thi ca i tng

Hm kin to sao chp mc nh

DTH

Hm kin to sao chp sinh ra n


Ging php gn mc nh, n ch sao chp trc tip cc d
liu thnh vin

C d liu con tr hy t vit hm kin to sao chp


INT2202

Tm tt 1
Con tr l a ch nh
Cho ta cch tham chiu gin tip ti bin

Bin ng
c to v hy khi chy chng trnh

Freestore
Vng nh cho bin ng

Mng cp pht ng
C kch thc ch nh khi chy chng trnh

DTH

INT2202

Tm tt 2
Hm hy
L hm thnh vin c bit ca lp
T ng hy i tng

Hm kin to sao chp

L hm thnh vin mt i s
c gi t ng khi cn bn sao tm thi

Ton t gn

Cn c np chng di dng hm thnh vin


Tr v tham chiu c th gi theo chui

DTH

INT2202

Chun b bi ti
c chng 12 gio trnh: c/ghi trn lung v tp

DTH

INT2202

You might also like