Tải bản đầy đủ (.pdf) (186 trang)

lap trinh c++ c++ buu chinh vien thong cuuduongthancong com

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.33 MB, 186 trang )

H C VI N CƠNG NGH B U CHÍNH VI N THƠNG

NGƠN NG

L P TRÌNH C++

(Dùng cho sinh viên h đào t o đ i h c t xa)
L u hành n i b

HÀ N I - 2006

CuuDuongThanCong.com

/>

NGƠN NG

L P TRÌNH C++
PGS.TS. Tr n ình Qu
KS. Nguy n M nh Hùng

L p trình nâng cao v i C++
L p trình h

CuuDuongThanCong.com

ng đ i t

ng v i C++

/>



2
CuuDuongThanCong.com

/>

GI I THI U
C++ là ngơn ng l p trình h ng đ i t ng đ c m r ng t ngơn ng C. Do v y, C++ có u
đi m là k th a đ c các đi m m nh truy n th ng c a ngôn ng C nh uy n chuy n, t ng thích
v i các thi t b ph n c ng. Hi n nay, C++ là m t ngôn ng l p trình ph bi n, đ c gi ng d y t i
các tr ng đ i h c trong n c và trên th gi i và đ c bi t đ c s d ng r ng rãi cho nhu c u phát
tri n c a công nghi p ph n m m hi n nay. Tài li u này không nh ng nh m gi i thi u cho sinh
viên ngơn ng l p trình C++, mà cịn mong mu n qua đó sinh viên có th hi u đ c t t ng c a
ph ng pháp l p trình h ng đ i t ng nói chung. N i dung c a tài li u bao g m hai ph n chính:


Ph n th nh t là l p trình nâng cao v i C++, bao g m l p trình C++ v i con tr và m ng,
các ki u d li u có c u trúc cùng các thao tác vào ra trên t p.



Ph n th hai là l p trình h ng đ i t ng v i C++, bao g m các đ nh ngh a và các thao
tác trên l p đ i t ng, tính k th a và t ng ng b i trong C++, cách s d ng m t s l p
c b n trong th vi n C++.

N i dung tài li u đ
Ch

c t ch c thành 7 ch


ng:

ng 1: Gi i thi u t ng quan v các ph

ng pháp l p trình

Trình bày các ph ng pháp l p trình tuy n tính, l p trình c u trúc và đ c bi t, làm quen
v i các khái ni m trong l p trình h ng đ i t ng.
Ch

ng 2: Con tr và m ng

Trình bày cách khai báo và s d ng các ki u con tr và m ng trong ngôn ng C++.
Ch

ng 3: Ki u d li u có c u trúc

Trình bày cách bi u di n và cài đ t m t s ki u c u trúc d li u tr u t ng trong C++. Sau
đó, trình bày cách áp d ng các ki u d li u này trong các ng d ng c th .
Ch

ng 4: Vào ra trên t p

Trình bày các thao tác đ c, ghi d li u trên các t p tin khác nhau: t p tin v n b n và t p tin
nh phân. Trình bày các cách truy nh p t p tin tr c ti p.
Ch

ng 5: L p đ i t

ng


Trình bày các khái ni m m đ u cho l p trình h ng đ i t ng trong C++, bao g m cách
khai báo và s d ng l p, các thu c tính c a l p; cách kh i t o và hu b đ i t ng, các
quy t c truy nh p đ n các thành ph n c a l p.
Ch

ng 6: Tính k th a và t

ng ng b i

Trình bày cách th c k th a gi a các l p trong C++, các nguyên t c truy nh p trong k
th a, đ nh ngh a n p ch ng các ph ng th c và tính đa hình trong l p trình h ng đ i
t ng v i C++.
Ch

ng 7: M t s l p quan tr ng

Trình bày cách s d ng m t s l p có s n trong th vi n chu n c a C++, bao g m các l p:
l p t p h p, l p chu i, l p ng n x p, l p hàng đ i và l p danh sách liên k t.
đ c đ c cu n sách này, sinh viên ph i quen bi t các khái ni m c b n v l p trình, có m t s
k n ng l p trình v i ngôn ng C ho c C++. Cu n sách này c ng có th dùng tài li u tham kh o
cho nh ng sinh viên mu n tìm hi u các k thu t l p trình nâng cao và l p trình h ng đ i t ng

3
CuuDuongThanCong.com

/>

v i C++. Cu n sách này có kèm theo m t đ a ch
l y làm minh ho và các bài t p trong cu n sách.


ng trình ch a tồn b các ch

ng trình đ

c

M c dù các tác gi đã có nhi u c g ng trong vi c biên so n tài li u này, song khơng th tránh
kh i nh ng thi u sót. R t mong nh n đ c nh ng ý ki n đóng góp quý báu t các sinh viên và các
b n đ ng nghi p.

4
CuuDuongThanCong.com

/>

Ch

ng 1: Gi i thi u v các ph

ng pháp l p trình

CH

NG 1

GI I THI U V CÁC PH
N i dung c a ch

ng này t p trung trình bày các ph




Ph

ng pháp l p trình tuy n tính



Ph

ng pháp l p trình h

ng c u trúc



Ph

ng pháp l p trình h

ng đ i t

NG PHÁP L P TRÌNH
ng pháp l p trình:

ng.

1.1 L P TRÌNH TUY N TÍNH
c tr ng c b n c a l p trình tuy n tính là t duy theo l i tu n t . Ch ng trình s đ c th c

hi n theo th t t đ u đ n cu i, l nh này k ti p l nh kia cho đ n khi k t thúc ch ng trình.

c tr ng
L p trình tuy n tính có hai đ c tr ng:



n gi n: ch

ng trình đ

c ti n hành đ n gi n theo l i tu n t , không ph c t p.

n lu ng: ch có m t lu ng cơng vi c duy nh t, và các công vi c đ
trong lu ng đó.

c th c hi n tu n t

Tính ch t


u đi m: Do tính đ n gi n, l p trình tuy n tính đ
gi n và có u đi m d hi u.



Nh c đi m: V i các ng d ng ph c t p, ng
gi i quy t.

c ng d ng cho các ch


ng trình đ n

i ta khơng th dùng l p trình tuy n tính đ

Ngày nay, l p trình tuy n tính ch t n t i trong ph m vi các modul nh nh t c a các ph ng pháp
l p trình khác. Ví d trong m t ch ng trình con c a l p trình c u trúc, các l nh c ng đ c th c
hi n theo tu n t t đ u đ n cu i ch ng trình con.

1.2 L P TRÌNH H
1.2.1

NG C U TRÚC

c tr ng c a l p trình h

ng c u trúc

Trong l p trình h ng c u trúc, ch ng trình chính đ c chia nh thành các ch ng trình con và
m i ch ng trình con th c hi n m t công vi c xác đ nh. Ch ng trình chính s g i đ n ch ng
trình con theo m t gi i thu t, ho c m t c u trúc đ c xác đ nh trong ch ng trình chính.
Các ngơn ng l p trình c u trúc ph bi n là Pascal, C và C++. Riêng C++ ngồi vi c có đ c tr ng
c a l p trình c u trúc do k th a t C, cịn có đ c tr ng c a l p trình h ng đ i t ng. Cho nên
C++ còn đ c g i là ngơn ng l p trình n a c u trúc, n a h ng đ i t ng.

c tr ng
c tr ng c b n nh t c a l p trình c u trúc th hi n

m i quan h :


5
CuuDuongThanCong.com

/>

Ch

ng 1: Gi i thi u v các ph

Ch

ng pháp l p trình

ng trình = C u trúc d li u + Gi i thu t

Trong đó:


C u trúc d li u là cách t ch c d li u cho vi c x lý b i m t hay nhi u ch
nào đó.



Gi i thu t là m t quy trình đ th c hi n m t cơng vi c xác đ nh

Trong ch

ng trình

ng trình, gi i thu t có quan h ph thu c vào c u trúc d li u:




M t c u trúc d li u ch phù h p v i m t s h n ch các gi i thu t.



N u thay đ i c u trúc d li u thì ph i thay đ i gi i thu t cho phù h p.



M t gi i thu t th

ng ph i đi kèm v i m t c u trúc d li u nh t đ nh.

Tính ch t
ng trình con có th đ



M i ch



Các ch ng trình con có th đ c g i đ n đ th c hi n theo m t th t b t kì, tu thu c
vào gi i thu t trong ch ng trình chính mà khơng ph thu c vào th t khai báo c a các
ch ng trình con.




Các ngơn ng l p trình c u trúc cung c p m t s c u trúc l nh đi u khi n ch

c g i th c hi n nhi u l n trong m t ch

ng trình chính.

ng trình.

u đi m


Ch



T duy gi i thu t rõ ràng.

ng trình sáng s a, d hi u, d theo dõi.

c đi m

Nh


L p trình c u trúc khơng h tr m nh vi c s d ng l i mã ngu n: Gi i thu t luôn ph
thu c ch t ch vào c u trúc d li u, do đó, khi thay đ i c u trúc d li u, ph i thay đ i gi i
thu t, ngh a là ph i vi t l i ch ng trình.




Khơng phù h p v i các ph n m m l n: t duy c u trúc v i các gi i thu t ch phù h p v i
các bài toán nh , n m trong ph m vi m t modul c a ch ng trình. V i d án ph n m m
l n, l p trình c u trúc t ra không hi u qu trong vi c gi i quy t m i quan h v mô gi a
các modul c a ph n m m.

V nđ
V n đ c b n c a l p trình c u trúc là b ng cách nào đ phân chia ch ng trình chính thành các
ch ng trình con cho phù h p v i yêu c u, ch c n ng và m c đích c a m i bài tốn. Thơng
th ng, đ phân rã bài tốn trong l p trình c u trúc, ng i ta s d ng ph ng pháp thi t k trên
xu ng (top-down).

1.2.2 Ph

ng pháp thi t k trên xu ng (top-down)

Ph ng pháp thi t k top-down ti p c n bài toán theo h ng t trên xu ng d i, t t ng qúat đ n
chi ti t. Theo đó, m t bài tốn đ c chia thành các bài toán con nh h n. M i bài toán con l i
đ c chia nh ti p, n u có th , thành các bài tốn con nh h n n a. Q trình này cịn đ c g i là
quá trình làm m n d n. Quá trình này s d ng l i khi các bài tốn con khơng c n chia nh thêm
6
CuuDuongThanCong.com

/>

Ch

ng 1: Gi i thi u v các ph

ng pháp l p trình


n a. Ngh a là khi m i bài tốn con đ u có th gi i quy t b ng m t ch
thu t đ n gi n.

ng trình con v i m t gi i

Ví d , s d ng ph ng pháp top-down đ gi i quy t bài toán xây m t c n nhà m i. Chúng ta có
th phân rã bài tốn theo các b c nh sau:


m c th nh t, chia bài toán xây nhà thành các bài toán nh h n nh làm móng, đ c t,
đ tr n, xây t ng, l p mái.



m c th hai, phân rã các công vi c m c th nh t nh vi c làm móng nhà có th phân
rã ti p thành các cơng vi c đào móng, gia c n n, làm khung s t, đ bê tong; công vi c đ
c t đ c ph n rã thành …



m c th ba, phân rã các cơng vi c c a m c th hai nh vi c đào móng có th phân chia
ti p thành các cơng vi c nh đo đ c, c m m c, ch ng dây, đào và ki m tra móng. Vi c gia
c n n đ c phân rã thành …

Quá trình phân rã có th d ng m c này, b i vì các cơng vi c con thu đ c nh đo đ c, c m
m c, ch ng dây, đào… có th th c hi n đ c ngay, khơng c n chia nh thêm n a.
L u ý:


Cùng s d ng ph ng pháp top-down v i cùng m t bài tốn, nh ng có th cho ra nhi u

k t qu khác nhau. Nguyên nhân là do s khác nhau trong tiêu chí đ phân rã m t bài tốn
thành các bài tốn con.

Ví d , v n áp d ng ph ng pháp top-down đ gi i quy t bài toán xây nhà, nh ng n u s d ng
m t cách khác đ phân chia bài tốn, ta có th thu đ c k t qu khác bi t so v i ph ng pháp ban
đ u:


m c th nh t, chia bài tốn xây nhà thành các bài toán nh h n nh làm ph n g , làm
ph n s t, làm ph n bê tơng và làm ph n g ch.



m c th hai, phân rã các công vi c m c th nh t là làm ph n g có th chia thành các
công vi c nh x g , gia công g , t o khung, l p vào nhà. Vi c làm s t có th chia nh
thành…

Rõ ràng, v i cách làm m n th này, ta s thu đ
hi n ph n trên.

1.3 L P TRÌNH H
1.3.1 L p trình h
Trong l p trình h

NG

ng đ i t
ng đ i t

IT


c m t k t qu khác h n v i cách th c đã th c

NG

ng

ng:
ng trình là các đ i t

ng và sau đó tr u t

ng hố đ i



Ng i ta coi các th c th trong ch
t ng thành l p đ i t ng.



D li u đ c t ch c thành các thu c tính c a l p. Ngu i ta ng n ch n vi c thay đ i tu
ti n d li u trong ch ng trình b ng các cách gi i h n truy nh p nh ch cho phép truy
nh p d li u thông qua đ i t ng, thông qua các ph ng th c mà đ i t ng đ c cung
c p…



Quan h gi a các đ i t ng là quan h ngang hàng ho c quan h k th a: N u l p B k
th a t l p A thì A đ c g i là l p c s và B đ c g i là l p d n xu t.


7
CuuDuongThanCong.com

/>

Ch

ng 1: Gi i thi u v các ph

ng pháp l p trình

Ngơn ng l p trình h ng đ i t ng ph bi n hi n nay là Java, C++, C#...M c dù C++ c ng có
nh ng đ c tr ng c b n c a l p trình h ng đ i t ng nh ng v n khơng ph i là ngơn ng l p
trình thu n h ng đ i t ng.

c tr ng
L p trình h

ng đ i t

ng có hai đ c tr ng c b n:



óng gói d li u: d li u luôn đ c t ch c thành các thu c tính c a l p đ i t
truy nh p đ n d li u ph i thông qua các ph ng th c c a đ i t ng l p.




S d ng l i mã ngu n: vi c s d ng l i mã ngu n đ c th hi n thông qua c ch k
th a. C ch này cho phép các l p đ i t ng có th k th a t các l p đ i t ng khác. Khi
đó, trong các l p d n xu t, có th s d ng các ph ng th c (mã ngu n) c a các l p c s
mà không c n ph i đ nh ngh a l i.

ng. Vi c

u đi m
L p trình h

ng đ i t

ng có m t s

u đi m n i b t:



Khơng cịn nguy c d li u b thay đ i t do trong ch ng trình. Vì d li u đã đ c đóng
gói vào các đ i t ng. N u mu n truy nh p vào d li u ph i thông qua các ph ng th c
đ c cho phép c a đ i t ng.



Khi thay đ i c u trúc d li u c a m t đ i t ng, không c n thay đ i mã ngu n c a các đ i
t ng khác, mà ch c n thay đ i m t s thành ph n c a đ i t ng d n xu t. i u này h n
ch s nh h ng x u c a vi c thay đ i d li u đ n các đ i t ng khác trong ch ng
trình.




Có th s d ng l i mã ngu n, ti t ki m tài nguyên, chi phí th i gian. Vì ngun t c k
th a cho phép các l p d n xu t s d ng các ph ng th c t l p c s nh nh ng ph ng
th c c a chính nó, mà khơng c n thi t ph i đ nh ngh a l i.



Phù h p v i các d án ph n m m l n, ph c t p.

1.3.2 M t s khái ni m c b n
Trong m c này, chúng ta s làm quen v i m t s khái ni m c b n trong l p trình h
t ng. Bao g m:


Khái ni m đ i t



Khái ni m đóng gói d li u (encapsulation)



Khái ni m k th a (inheritance)



Khái ni m đa hình (polymorphism)

it


ng đ i

ng (object)

ng (Object)

Trong l p trình h ng đ i t ng, đ i t ng đ c coi là đ n v c b n nh nh t. Các d di u và
cách x lí ch là thành ph n c a đ i t ng mà không đ c coi là th c th . M t đ i t ng ch a các
d li u c a riêng nó, đ ng th i có các ph ng th c (hành đ ng) thao tác trên các d li u đó:
it

ng = d li u + ph

ng th c

8
CuuDuongThanCong.com

/>

Ch

ng 1: Gi i thi u v các ph

ng pháp l p trình

L p (Class)
Khi có nhi u đ i t ng gi ng nhau v m t d li u và ph
và g i chung là l p:




L p là s tr u t
it

ng hoá c a đ i t

ng th c, chúng đ

c nhóm l i v i nhau

ng

ng là m t th hi n c a l p.

óng gói d li u (Encapsulation)


Các d li u đ
riêng.

c đóng gói vào trong đ i t



Khơng th truy nh p đ n d li u m t cách t do nh l p trình c u trúc



Mu n truy nh p đ n các d li u đã đ c b o v , ph i thông qua các đ i t ng, ngh a là

ph i s d ng các ph ng th c mà đ i t ng cung c p m i có th truy nh p đ n d li u
c a đ i t ng đó.

ng. M i d li u có m t ph m vi truy nh p

Tuy nhiên, vì C++ ch là ngơn ng l p trình n a đ i t ng, cho nên C++ v n cho phép đ nh ngh a
các bi n d li u và các hàm t do, đây là k t qu k th a t ngôn ng C, m t ngôn ng l p trình
thu n c u trúc.

K th a (Inheritance)
Tính k th a c a l p trình h ng đ i t ng cho phép m t l p có th k
t i. Khi đó, l p m i có th s d ng d li u và ph ng th c c a các l
Ngoài ra, l p d n xu t cịn có th b sung thêm m t s d li u và ph
th a là khi thay đ i d li u c a m t l p, ch c n thay đ i các ph ng th
mà không c n thay đ i trong các l p d n xu t.

th a t m t s l p đã t n
p c s nh là c a mình.
ng th c. u đi m c a k
c trong ph m vi l p c s

a hình (Polymorphsim)
a hình là khái ni m ln đi kèm v i k th a. Do tính k th a, m t l p có th s d ng l i các
ph ng th c c a l p khác. Tuy nhiên, n u c n thi t, l p d n xu t c ng có th đ nh ngh a l i m t
s ph ng th c c a l p c s . ó là s n p ch ng ph ng th c trong k th a. Nh s n p ch ng
ph ng th c này, ta ch c n g i tên ph ng th c b n p ch ng t đ i t ng mà khơng c n quan
tâm đó là đ i t ng c a l p nào. Ch ng trình s t đ ng ki m tra xem đ i t ng là thu c ki u
l p c s hay thu c l p d n xu t, sau đó s g i ph ng th c t ng ng v i l p đó. ó là tính đa
hình.


1.3.3 L p trình h

ng đ i t

ng trong C++

Vì C++ là m t ngơn ng l p trình đ c m r ng t m t ngôn ng l p trình c u trúc C nên C++
đ c xem là ngơn ng l p trình n a h ng đ i t ng, n a h ng c u trúc.

Nh ng đ c tr ng h

ng đ i t

ng c a C++



Cho phép đ nh ngh a l p đ i t



Cho phép đóng gói d li u vào các l p đ i t ng. Cho phép đ nh ngh a ph m vi truy nh p
d li u c a l p b ng các t khoá ph m vi: public, protected, private.

ng.

9
CuuDuongThanCong.com

/>


Ch

ng 1: Gi i thi u v các ph

ng pháp l p trình



Cho phép k th a l p v i các ki u k th a khác nhau tu vào t khố d n xu t.



Cho phép l p d n xu t s d ng các ph



Cho phép đ nh ngh a ch ng ph

Nh ng h n ch h

ng đ i t

ng th c c a l p c s (trong ph m vi quy đ nh).

ng th c trong l p d n xu t.

ng c a C++

Nh ng h n ch này là do C++ đ


c phát tri n t m t ngôn ng l p trình thu n c u trúc C.



Cho phép đ nh ngh a và s d ng các bi n d li u t do.



Cho phép đ nh ngh a và s d ng các hàm t do.



Ngay c khi d li u đ c đóng gói vào l p, d li u v n có th truy nh p tr c ti p nh d
li u t do b i các hàm b n, l p b n (friend) trong C++.

T NG K T CH

NG 1

Ch ng 1 đã trình bày t ng quan v các ph ng pháp l p trình hi n nay. N i dung t p trung vào
ba ph ng pháp l p trình có liên quan tr c ti p đ n ngôn ng l p trình C++:


L p trình tuy n tính



L p trình h


ng c u trúc



L p trình h

ng đ i t

ng.

C++ là ngơn ng l p trình đ c m r ng t ngơn ng l p trình c u trúc C. Do đó, C++ v a có
nh ng đ c tr ng c a l p trình c u trúc, v a có nh ng đ c tr ng c a l p trình h ng đ i t ng.

10
CuuDuongThanCong.com

/>

Ch

ng 2: Con tr và m ng

CH

NG 2

CON TR

VÀ M NG


N i dung c a ch ng này t p trung trình bày các v n đ c b n liên quan đ n các thao tác trên
ki u d li u con tr và m ng trong C++:


Khái ni m con tr , cách khai báo và s d ng con tr .



M i quan h gi a con tr và m ng



Con tr hàm



C p phát b nh cho con tr

2.1 KHÁI NI M CON TR
2.1.1 Khai báo con tr
Con tr là m t bi n đ c bi t ch a đ a ch c a m t bi n khác. Con tr có cùng ki u d li u v i ki u
d li u c a bi n mà nó tr t i. Cú pháp khai báo m t con tr nh sau:

li u> *<Tên con tr >;

Trong đó:


Ki u d li u: Có th là các ki u d li u c b n c a C++, ho c là ki u d li u có c u trúc,

ho c là ki u đ i t ng do ng i dùng t đ nh ngh a.



Tên con tr : Tuân theo qui t c đ t tên bi n c a C++:
-

Ch đ

c b t đ u b ng m t kí t (ch ), ho c d u g ch d

-

B t đ u t kí t th hai, có th có ki u kí t s .

-

Khơng có d u tr ng (space bar) trong tên bi n.

-

Có phân bi t ch hoa và ch th

-

Không gi i h n đ dài tên bi n.

i “_”.

ng.


Ví d , đ khai báo m t bi n con tr có ki u là int và tên là pointerInt, ta vi t nh sau:
int *pointerInt;

L


Có th vi t d u con tr “*” ngay sau ki u d li u, ngh a là hai cách khai báo sau là t
đ ng:

ng

int *pointerInt;
int* pointerInt;



Các cách khai báo con tr nh sau là sai cú pháp:
*int pointerInt;

// Khai báo sai con tr

int pointerInt*;

// Khai báo sai con tr

2.1.2 S d ng con tr
Con tr đ

c s d ng theo hai cách:


11
CuuDuongThanCong.com

/>

Ch

ng 2: Con tr và m ng



Dùng con tr đ l u đ a ch c a bi n đ thao tác



L y giá tr c a bi n do con tr tr đ n đ thao tác

Dùng con tr đ l u đ a ch c a bi n
B n thân con tr s đ
phép gán nh sau:

c tr vào đ a ch c a m t bi n có cùng ki u d li u v i nó. Cú pháp c a

<Tên con tr > = &<tên bi n>;

L


Trong phép tốn này, tên con tr khơng có d u “*”.


Ví d :
int x, *px;
px = &x;

s cho con tr px có ki u int tr vào đ a ch c a bi n x có ki u nguyên. Phép toán &<Tên bi n>
s cho đ a ch c a bi n t ng ng.
L y giá tr c a bi n do con tr tr đ n
Phép l y giá tr c a bi n do con tr tr đ n đ

c th c hi n b ng cách g i tên:

*<Tên con tr >;

L uý


Trong phép tốn này, ph i có d u con tr “*”. N u khơng có d u con tr , s tr thành
phép l y đ a ch c a bi n do con tr tr t i.

Ví d :
int x = 12, y, *px;
px = &y;
*px = x;

Quá trình di n ra nh sau:
int x = 12, y, *px;

x = 12


y=0

px

px = &y;

x = 12

y=0

px

px = x;

x = 12

y=x =12

px

null

con tr px v n tr t i đ a ch bi n y và giá tr c a bi n y s là 12.

Phép gán gi a các con tr
Các con tr cùng ki u có th gán cho nhau thông qua phép gán và l y đ a ch con tr :

1> =

2>;

L uý


Trong phép gán gi a các con tr , b t bu c ph i dùng phép l y đ a ch c a bi n do con tr
tr t i (khơng có d u “*” trong tên con tr ) mà không đ c dùng phép l y giá tr c a
bi n do con tr tr t i.

12
CuuDuongThanCong.com

/>

Ch

ng 2: Con tr và m ng



Hai con tr ph i cùng ki u. Trong tr ng h p hai con tr khác ki u, ph i s d ng các
ph ng th c ép ki u t ng t nh trong phép gán các bi n thông th ng có ki u khác
nhau.

Ví d :
int x = 12, *px, *py;
px = &x;
py = px;
py


null

px

py

null

px

py

int x = 12, *px, *py;

x = 12

px

px = &x;

x = 12

py = px;

x = 12

null

con tr py c ng tr vào đ a ch c a bi n x nh con tr px. Khi đó *py c ng có giá tr 12 gi ng nh
*px và là giá tr c a bi n x.

Ch
Ch

ng trình 2.1 minh ho vi c dùng con tr gi a các bi n c a m t ch

ng trình C++.

ng trình 2.1

#include <stdio.h>
#include <conio.h>
void main(void){
int x = 12, *px, *py;
cout << ”x = ” << x << endl;
px = &x;

// Con tr

px tr

t i đ a ch

c a x

cout << ”px = &x, *px = ” << *px << endl;
*px = *px + 20;

// N i dung c a px là 32

cout << ”*px = *px+20, x = ” << x << endl;

// Cho py tr

*py += 15;

// N i dung c a py là 47

cout << ”py = px, *py +=15, x =

t i ch

mà px tr : đ a ch

py = px;

c a x

” << x << endl;

}

Trong ch ng trình 2.1, ban đ u bi n x có giá tr 12. Sau đó, con tr px tr vào đ a ch c a bi n x
nên con tr px c ng có giá tr 12. Ti p theo, ta t ng giá tr c a con tr px thêm 20, giá tr c a con
tr px là 32. Vì px đang tr đ n đ a ch c a x nên x c ng có giá tr là 32. Sau đó, ta cho con tr py
tr đ n v trí mà px đang tr t i (đ a ch c a bi n x) nên py c ng có giá tr 32. Cu i cùng, ta t ng
giá tr c a con tr py thêm 15, py s có giá tr 37. Vì py c ng đang tr đ n đ a ch c a x nên x
c ng có giá tr 37. Do đó, ví d 2.1 s in ra k t qu nh sau:

13
CuuDuongThanCong.com


/>

Ch

ng 2: Con tr và m ng
x = 12
px = &x, *px = 12
*px = *px + 20, x = 32
py = px, *py += 15, x = 37

2.2 CON TR

VÀ M NG

2.2.1 Con tr và m ng m t chi u
M ng m t chi u
Trong C++, tên m t m ng đ c coi là m t ki u con tr h ng, đ c đ nh v t i m t vùng nh xác
đ nh và đ a ch c a tên m ng trùng v i đ a ch c a ph n t đ u tiên c a m ng.
Ví d khai báo:
int A[5];

thì đ a ch c a m ng A (c ng vi t là A) s trùng v i đ a ch ph n t đ u tiên c a m ng A (là
&A[0]) ngh a là:
A = &A[0];

Quan h gi a con tr và m ng
Vì tên c a m ng đ
ki u.

c coi nh m t con tr h ng, nên nó có th đ


c gán cho m t con tr có cùng

Ví d khai báo:
int A[5] = {5, 10, 15, 20, 25};
int *pa = A;
int A[5] = {5, 10, 15, 20, 25};

A

A[0]=5

A[1]=10 A[2]=15 A[3]=20 A[4]= 25

int *pa = A;

A

A[0]=5

A[1]=10 A[2]=15 A[3]=20 A[4]= 25

pa

thì con tr pa s tr đ n m ng A, t c là tr đ n đ a ch c a ph n t A[0], cho nên hai khai báo sau
là t ng đ ng:
pa = A;
pa = &A[0];

V i khai báo này, thì đ a ch tr t i c a con tr pa là đ a ch c a ph n t A[0] và giá tr c a con tr

pa là giá tr c a ph n t A[0], t c là *pa = 5;

Phép toán trên con tr và m ng
Khi m t con tr tr đ n m ng, thì các phép toán t ng hay gi m trên con tr s t
d ch chuy n trên m ng.

ng ng v i phép

Ví d khai báo:
int A[5] = {5, 10, 15, 20, 25};

14
CuuDuongThanCong.com

/>

Ch

ng 2: Con tr và m ng
int *pa = &A[2];

thì con tr pa s tr đ n đ a ch c a ph n t A[2] và giá tr c a pa là: *pa = A[2] = 15.
Khi đó, phép toán:
pa = pa + 1;

s đ a con tr pa tr đ n đ a ch c a ph n t ti p theo c a m ng A, đó là đ a ch c a A[3]. Sau đó,
phép tốn:
pa = pa – 2;

s đ a con tr pa tr đ n đ a ch c a ph n t A[1].

int A[5] = {5, 10, 15, 20, 25};

A

A[0]=5

A[1]=10 A[2]=15 A[3]=20 A[4]= 25

int *pa = &A[2];

A

A[0]=5

A[1]=10 A[2]=15 A[3]=20 A[4]= 25

A[0]=5

A[1]=10 A[2]=15 A[3]=20 A[4]= 25

A[0]=5

A[1]=10 A[2]=15 A[3]=20 A[4]= 25

pa
A

pa = pa + 1;

pa

A

pa = pa - 2;

pa

L u ý:


Hai phép tốn pa++ và *pa++ có tác d ng hồn tồn khác nhau trên m ng, pa++ là thao
tác trên con tr , t c là trên b nh , nó s đ a con tr pa tr đ n đ a ch c a ph n t ti p
theo c a m ng. *pa++ là phép tốn trên giá tr , nó t ng giá tr hi n t i c a ph n t m ng
lên m t đ n v .
Ví d :
int A[5] = {5, 10, 15, 20, 25};
int *pa = &A[2];

thì pa++ là t

ng đ

nh ng *pa++ l i t

ng v i pa = &A[3] và *pa = 20.
ng đ

ng v i pa = &A[2] và *pa = 15+1 = 16, A[2] = 16.

15
CuuDuongThanCong.com


/>

Ch

ng 2: Con tr và m ng

int A[5] = {5, 10, 15, 20, 25};

A

A[0]=5

A[1]=10 A[2]=15 A[3]=20 A[4]= 25

int *pa = &A[2];

A

A[0]=5

A[1]=10 A[2]=15 A[3]=20 A[4]= 25

A[0]=5

A[1]=10 A[2]=15 A[3]=20 A[4]= 25

A[0]=5

A[1]=10 A[2]=16 A[3]=20 A[4]= 25


pa
A

pa ++;

pa
A

Nh ng *pa ++;

pa



Trong tr

ng h p:

int A[5] = {5, 10, 15, 20, 25};
int *pa = &A[4];

thì phép toán pa++ s đ a con tr pa tr đ n m t đ a ch không xác đ nh. Lí do là A[4] là
ph n t cu i c a m ng A, nên pa++ s tr đ n đ a ch ngay sau đ a ch c a A[4], đ a ch
này n m ngoài vùng ch s c a m ng A nên không xác đ nh. T ng t v i tr ng h p
pa=&A[0], phép toán pa-- c ng đ a pa tr đ n m t đ a ch không xác đ nh.

int A[5] = {5, 10, 15, 20, 25};

A


A[0]=5

A[1]=10 A[2]=15 A[3]=20 A[4]= 25

int *pa = &A[2];

A

A[0]=5

A[1]=10 A[2]=15 A[3]=20 A[4]= 25

A[0]=5

A[1]=10 A[2]=15 A[3]=20 A[4]= 25

A[0]=5

A[1]=10 A[2]=15 A[3]=20 A[4]= 25

A[0]=5

A[1]=10 A[2]=15 A[3]=20 A[4]= 25

pa
A

pa ++;


null

pa
A

pa = &A[0];

pa

pa --;

null

A
pa



Vì m ng A là con tr h ng, cho nên không th th c hi n các phép tốn trên A mà ch có
th th c hi n trên các con tr tr đ n A: các phép toán pa++ ho c pa--là h p l , nh ng các
phép tốn A++ ho c A--là khơng h p l .

Ch ng trình 2.2a minh ho vi c cài đ t m t th t c s p x p các ph n t c a m t m ng theo cách
thông th ng.

16
CuuDuongThanCong.com

/>


Ch

Ch

ng 2: Con tr và m ng

ng trình 2.2a

void SortArray(int A[], int n){
int temp;
for(int i=0; ifor(int j=i+1; jif(A[i] > A[j]){
temp = A[i];
A[i] = A[j];
A[j] = temp;
}
}

Ch ng trình 2.2b cài đ t m t th t c t
toàn gi ng nhau.
Ch

ng t b ng con tr . Hai th t c này có ch c n ng hồn

ng trình 2.2b

void SortArray(int *A, int n){
int temp;
for(int i=0; i

for(int j=i+1; jif(*(A+i) > *(A+j)){
temp = *(A+i);
*(A+i) = *(A+j);
*(A+j) = temp;
}
}

Trong ch ng trình 2.2b, thay vì dùng m t m ng, ta dùng m t con tr đ tr đ n m ng c n s p
x p. Khi đó, ta có th dùng các thao tác trên con tr thay vì các thao tác trên các ph n t m ng.

2.2.2 Con tr và m ng nhi u chi u
Con tr và m ng nhi u chi u
M t câu h i đ t ra là n u m t ma tr n m t chi u thì t
nhi u chi u thì t ng đ ng v i con tr nh th nào?

ng đ

ng v i m t con tr , v y m t m ng

Xét ví d :
int A[3][3] = {
{5, 10, 15},
{20, 25, 30},
{35, 40, 45}
};

17
CuuDuongThanCong.com


/>

Ch

ng 2: Con tr và m ng

Khi đó, đ a ch c a ma tr n A chính là đ a ch c a hàng đ u tiên c a ma tr n A, và c ng là đ a ch
c a ph n t đ u tiên c a hàng đ u tiên c a ma tr n A:


a ch c a ma tr n A:

A = A[0] = *(A+0) = &A[0][0];



a ch c a hàng th nh t:

A[1] = *(A+1) = &A[1][0];



a ch c a hàng th i:

A[i] = *(A+i) = &A[i][0];



a ch ph n t


&A[i][j] = (*(A+i)) + j;



Giá tr ph n t

A[i][j] = *((*(A+i)) + j);

Nh v y, m t m ng hai chi u có th thay th b ng m t m ng m t chi u các con tr cùng ki u:
int A[3][3];

có th thay th b ng:
int (*A)[3];

Con tr tr t i con tr
Vì m t m ng hai chi u int A[3][3] có th thay th b ng m t m ng các con tr int (*A)[3]. H n
n a, m t m ng int A[3] l i có th thay th b ng m t con tr int *A. Do v y, m t m ng hai chi u
có th thay th b ng m t m ng các con tr , ho c m t con tr tr đ n con tr . Ngh a là các cách
vi t sau là t ng đ ng:
int A[3][3];
int (*A)[3];
int **A;

2.3 CON TR

HÀM

M c dù hàm không ph i là m t bi n c th nên khơng có m t đ a ch xác đ nh. Nh ng trong khi
ch y, m i m t hàm trong C++ c ng có m t vùng nh xác đ nh, do v y, C++ cho phép dùng con
tr đ tr đ n hàm. Con tr hàm đ c dùng đ truy n tham s có d ng hàm.


Khai báo con tr hàm
Con tr hàm đ c khai báo t ng t nh khai báo nguyên m u hàm thông th ng trong C++,
ngo i tr vi c có thêm kí hi u con tr “*” tr c tên hàm. Cú pháp khai báo con tr hàm nh sau:

li u tr

v > (*<Tên hàm>)([<Các tham s >]);

Trong đó:


Ki u d li u tr v : là các ki u d li u thơng th
t đ nh ngh a.



Tên hàm: tên do ng



Các tham s : có th có ho c khơng (ph n trong d u “[]” là tu ch n). N u có nhi u tham
s , m i tham s đ c phân cách nhau b i d u ph y.

ng c a C++ ho c ki u do ng

i dùng t đ nh ngh a, tuân th theo quy t c đ t tên bi n trong C++.

Ví d khai báo:

int (*Calcul)(int a, int b);

là khai báo m t con tr hàm, tên là Calcul, có ki u int và có hai tham s c ng là ki u int.
L u ý:

18
CuuDuongThanCong.com

i dùng

/>

Ch

ng 2: Con tr và m ng



D u “()” bao b c tên hàm là c n thi t đ ch ra r ng ta đang khai báo m t con tr hàm.
N u khơng có d u ngo c đ n này, trình biên d ch s hi u r ng ta đang khai báo m t hàm
thông th ng và có giá tr tr v là m t con tr .
Ví d , hai khai báo sau là khác nhau hoàn toàn:
// Khai báo m t con tr

hàm

int (*Calcul)(int a, int b);
// Khai báo m t hàm tr

v


ki u con tr

int *Calcul(int a, int b);

S d ng con tr hàm
Con tr hàm đ c dùng khi c n g i m t hàm nh là tham s c a m t hàm khác. Khi đó, m t hàm
đ c g i ph i có khn m u gi ng v i con tr hàm đã đ c khai báo.
Ví d , v i khai báo:
int (*Calcul)(int a, int b);

thì có th g i các hàm có hai tham s ki u int và tr v c ng ki u int nh sau:
int add(int a, int b);
int sub(int a, int b);

nh ng không đ

c g i các hàm khác ki u tham s ho c ki u tr v nh sau:

int add(float a, int b);
int add(int a);
char* sub(char* a, char* b);

Ch
Ch

ng trình 2.3 minh ho vi c khai báo và s d ng con tr hàm.
ng trình 2.3

#include <ctype.h>

#include <string>
// Hàm có s

d ng con tr

hàm nh

tham s

void Display(char[] str, int (*Xtype)(int c)){
int index = 0;
while(str[index] != ‘\0’){
cout << (*Xtype)(str[index]); // S

d ng con tr

hàm

index ++;
}
return;
}
// Hàm main, dùng l i g i hàm đ n con tr

hàm

void main(){
char input[500];
cout << “Enter the string: ”;
cin >> input;


19
CuuDuongThanCong.com

/>

Ch

ng 2: Con tr và m ng

char reply;
cout << “Display the string in uppercase or lowercase (u,l): ”;
cin >> reply;
if(reply == ‘l’)

// Hi n th

theo d ng lowercase

Display(str, tolower);
else

// Hi n th

theo d ng uppercase

Display(str, toupper);
return;
}


Ch

ng trình 2.3 khai báo hàm Display() có s d ng con tr hàm có khuôn m u
int (*Xtype)(int c);

Trong hàm main, con tr hàm này đ c g i b i hai th hi n là các hàm tolower() và hàm
toupper(). Hai hàm này đ c khai báo trong th vi n ctype.h v i m u nh sau:
int tolower(int c);
int toupper(int c);

Hai khuôn m u này phù h p v i con tr hàm Xtype trong hàm Display() nên l i g i hàm
Display() trong hàm main là h p l .

2.4 C P PHÁT B
Xét hai tr


Tr

NH

NG

ng h p sau đây:
ng h p 1, khai báo m t con tr và gán giá tr cho nó:
int *pa = 12;



Tr ng h p 2, khai báo con tr đ n ph n t cu i cùng c a m ng r i t ng thêm m t đ n v

cho nó:
int A[5] = {5, 10, 15, 20, 25};
int *pa = &A[4];
pa++;

Trong c hai tr ng h p, ta đ u không bi t th c s con tr pa đang tr đ n đ a ch nào trong b
nh : tr ng h p 1 ch ra r ng con tr pa đang tr t i m t đ a ch không xác đ nh, nh ng l i ch a
giá tr là 12 do đ c gán vào. Tr ng h p 2, con tr pa đã tr đ n đ a ch ngay sau đ a ch ph n t
cu i cùng c a m ng A, đó c ng là m t đ a ch không xác đ nh. Các đ a ch không xác đ nh này là
các đ a ch n m vùng nh t do còn th a c a b nh . Vùng nh này có th b chi m d ng b i
b t kì m t ch ng trình nào đang ch y.
Do đó, r t có th các ch ng trình khác s chi m m t các đ a ch mà con tr pa đang tr t i. Khi
đó, n u các ch ng trình thay đ i giá tr c a đ a ch đó, giá tr pa c ng b thay đ i theo mà ta
khơng th ki m sốt đ c.
tránh các r i ro có th g p ph i, C++ yêu c u ph i c p phát b nh
m t cách t ng minh cho con tr tr c khi s d ng chúng.

20
CuuDuongThanCong.com

/>

Ch

ng 2: Con tr và m ng

2.4.1 C p phát b nh đ ng cho bi n
C p phát b nh đ ng
Thao tác c p phát b nh cho con tr th c ch t là gán cho con tr m t đ a ch xác đ nh và đ a đ a
ch đó vào vùng đã b chi m d ng, các ch ng trình khác khơng th s d ng đ a ch đó. Cú pháp

c p phát b nh cho con tr nh sau:
<tên con tr > = new <ki u con tr >;

Ví d , khai báo:
int *pa;
pa = new int;

s c p phát b nh h p l cho con tr pa.
L u ý:


Ta có th v a c p phát b nh , v a kh i t o giá tr cho con tr theo cú pháp sau:
int *pa;
pa = new int(12);

s c p phát cho con tr pa m t đ a ch xác đ nh, đ ng th i gán giá tr c a con tr *pa = 12.

Gi i phóng b nh đ ng
a ch c a con tr sau khi đ c c p phát b i thao tác new s tr thành vùng nh đã b chi m
d ng, các ch ng trình khác khơng th s d ng vùng nh đó ngay c khi ta khơng dùng con tr
n a.
ti t ki m b nh , ta ph i hu b vùng nh c a con tr ngay sau khi không dùng đ n con
tr n a. Cú pháp hu b vùng nh c a con tr nh sau:
delete <tên con tr >;

Ví d :
int *pa = new int(12);

// Khai báo con tr


nh

ban đ u cho pa là 12.

// và gán giá tr
delete pa;

pa, c p phát b

// Gi i phóng vùng nh

v a c p cho pa.

L u ý:


M t con tr , sau khi b gi i phóng đ a ch , v n có th đ
ho c tr đ n m t đ a ch m i:

c c p phát m t vùng nh m i

int *pa = new int(12);

// Khai báo con tr pa, c p phát b nh
// và gán giá tr ban đ u cho pa là 12.

delete pa;

// Gi i phóng vùng nh


v a c p cho pa.

int A[5] = {5, 10, 15, 20, 25};
pa = A;



// Cho pa tr

đ n đ a ch

c a m ng A

N u có nhi u con tr cùng tr vào m t đ a ch , thì ch c n gi i phóng b nh c a m t con
tr , t t c các con tr còn l i c ng b gi i phóng b nh :
int *pa = new int(12);

// *pa = 12

int *pb = pa;

// pb tr

*pb += 5;

// *pa = *pb = 17

delete pa;

// Gi i phóng c


đ n cùng đ a ch

pa.

pa l n pb

21
CuuDuongThanCong.com

/>

Ch

ng 2: Con tr và m ng

M t con tr sau khi c p phát b nh đ ng b ng thao tác new, c n ph i phóng b nh tr
khi tr đ n m t đ a ch m i ho c c p phát b nh m i:



int *pa = new int(12);

// pa đ

*pa = new int(15);

// pa tr

c c p b


// đ a ch

nh

và *pa = 12

đ n đ a ch
c

c

khác và *pa = 15.

c a pa v n b

coi là b n

2.4.2 C p phát b nh cho m ng đ ng m t chi u
C p phát b nh cho m ng đ ng m t chi u
M ng m t chi u đ c coi là t ng ng v i m t con tr cùng ki u. Tuy nhiên, cú pháp c p phát b
nh cho m ng đ ng m t chi u là khác v i cú pháp c p phát b nh cho con tr thông th ng:
<Tên con tr > = new <Ki u con tr >[<

dài m ng>];

Trong đó:
i dùng đ t, tuân th theo quy t c đ t tên bi n c a C++.




Tên con tr : tên do ng



Ki u con tr : Ki u d li u c b n c a C++ ho c là ki u do ng



dài m ng: s l

i dùng t đ nh ngh a.

ng các ph n t c n c p phát b nh c a m ng.

Ví d :
int *A = new int[5];

s khai báo m t m ng A có 5 ph n t ki u int đ

c c p phát b nh đ ng.

L u ý:


Khi c p phát b nh cho con tr có kh i t o thơng th ng, ta dùng d u “()”, khi c p phát
b nh cho m ng, ta dùng d u “[]”. Hai l nh c p phát sau là hoàn toàn khác nhau:
// C p phát b

nh


và kh i t o cho m t con tr

int

int *A = new int(5);
// C p phát b

nh

cho m t m ng 5 ph n t

ki u int

int *A = new int[5];

Gi i phóng b nh c a m ng đ ng m t chi u
gi i phóng vùng nh đã đ

c c p phát cho m t m ng đ ng, ta dùng cú pháp sau:

delete [] <tên con tr >;

Ví d :
// C p phát b

nh

cho m t m ng có 5 ph n t


ki u int

int *A = new int[5];
// Gi i phóng vùng nh

do m ng A đang chi m gi .

delete [] A;

Ch
Ch

ng trình 2.4 minh ho hai th t c kh i t o và gi i phóng m t m ng đ ng m t chi u.
ng trình 2.4

void InitArray(int *A, int length){
A = new int[length];
for(int i=0; i
22
CuuDuongThanCong.com

/>

Ch

ng 2: Con tr và m ng
A[i] = 0;
return;


}
void DeleteArray(int *A){
delete [] A;
return;
}

2.4.3 C p phát b nh cho m ng đ ng nhi u chi u
C p phát b nh cho m ng đ ng nhi u chi u
M t m ng hai chi u là m t con tr đ n m t con tr . Do v y, ta ph i c p phát b nh theo t ng
chi u theo cú pháp c p phát b nh cho m ng đ ng m t chi u.
Ví d :
int **A;
const int length = 10;
A = new int*[length];

// C p phát b

nh

cho s

dòng c a ma tr n A

for(int i=0; i// C p phát b

nh

cho các ph n t


c a m i dòng

A[i] = new int[length];

s c p phát b nh cho m t m ng đ ng hai chi u, t
10*10.

ng đ

ng v i m t ma tr n có kích th

c

L u ý:
Trong l nh c p phát A = new int*[length], c n ph i có d u “*” đ ch ra r ng c n c p
phát b nh cho m t m ng các ph n t có ki u là con tr int (int*), khác v i ki u
int bình th ng.



Gi i phóng b nh c a m ng đ ng nhi u chi u
Ng c l i v i khi c p phát, ta ph i gi i phóng l n l
hàng c a m ng đ ng.

t b nh cho con tr t

ng ng v i c t và

Ví d :
int **A;

…;

// c p phát b

nh


for(int i=0; idelete [] A[i];
delete [] A;

// Gi i phóng b

nh

cho m i dịng

// Gi i phóng b

nh

cho m ng các dịng

s gi i phóng b nh cho m t m ng đ ng hai chi u.
Ch

ng trình 2.5 minh ho vi c dùng m ng đ ng hai chi u đ tính t ng c a hai ma tr n.

23
CuuDuongThanCong.com


/>

Ch

Ch

ng 2: Con tr và m ng

ng trình 2.5

#include<stdio.h>
#include<conio.h>
/* Khai báo nguyên m u hàm */
void InitArray(int **A, int row, int colum);
void AddArray(int **A, int **B, int row, int colum);
void DisplayArray(int **A, int row, int colum);
void DeleteArray(int **A, int row);
void InitArray(int **A, int row, int colum){
A = new int*[row];
for(int i=0; iA[i] = new int[colum];
for(int j=0; jcout << “Phan tu [” << i << “,” << j << “] = ”;
cin >> A[i][j];
}
return;
}
void AddArray(int **A, int **B, int row, int colum){
for(int i=0; i

for(int j=0; jA[i][j] += B[i][j];
return;
}
void DisplayArray(int **A, int row, int colum){
for(int i=0; ifor(int j=0; jcout << A[i][j] << “ ”;
cout << endl; // Xu ng dòng
return;
}
void DeleteArray(int **A, int row){
for(int i=0; idelete [] A[i];
delete [] A;
return;
}

24
CuuDuongThanCong.com

/>

×