Trang 1
Tham kho toàn din v Con tr trong C/C++
NhatPhuongLe
w w w .rea on line .n et
Tham kho toàn din v
Con tr” trong C/C++
Re verse Engineering Associa t ion
Win32ProgrammingTutorial
For more updated info, please check
http://nhatphuongle.spaces.live.com
Tham kho toàn din v Con tr trong C/C++
NhatPhuongLe
w w w .rea on line .n et
MC LC
I. Con tr....................................................................................................................................... 3
1. Mt s khái nim.............................................................................................................................3
2. Biến...................................................................................................................................................3
a) Biến .................................................................................................................................... 3
b) Ví d................................................................................................................................... 4
3. Con tr................................................................................................................................... 5
a) Khái nim.....................................................................................................................................6
b) Ti sao phi dùng con tr...........................................................................................................7
c) Mt s thao tác cơ bn vi con tr............................................................................................9
II. Con tr hàm ............................................................................................................................. 11
1. Mt s khái nim ................................................................................................................. 11
2. Con tr hàm.......................................................................................................................... 11
a) Khái nim...................................................................................................................................11
b) Cú pháp.......................................................................................................................................12
c) Định nghĩa mt con tr hàm.....................................................................................................12
3. Kiu quy ước gi ca hàm ................................................................................................... 13
4. Gán mt hàm (địa ch hàm) vào/cho con tr hàm ............................................................... 13
5. Gi hàm s dng con tr hàm.............................................................................................. 15
6. Ti sao s dng con tr hàm................................................................................................ 16
7. Định nghĩa con tr hàm bng t khóa typedef..................................................................... 20
III. Tài liu tham kho ................................................................................................................... 21
Trang 2
Re verse Engineering Associa t ion
Tham kho toàn din v Con tr trong C/C++
NhatPhuongLe
w w w .rea on line .n et
I. Con tr
1. Mt s khái nim
Con tr (pointer) đơn gin là địa ch ca mt đối tượng trong b nh. Thông
thường, các đối tượng có th được truy xut bng mt trong 2 cách: trc tiếp bng đại
din hoc gián tiếp bng con tr. Các biến con tr được định nghĩa tr ti các đối tượng
có mt kiu d liu c th sao cho khi con tr b hy đi thì vùng nhđối tượng đuc
cp phát s đưc gii phóng hoc thu hi.
Các con tr thường được dùng để to ra các đối tượng động trong lúc thc thi
chương trình. Không ging như các đối tượng bình thường (biến cc b và toàn cc)
được cp phát và lưu tr trong ngăn xếp (stack), mt đối tượng động được cp phát vùng
nh t vùng lưu tr khác đưc gi là heap. Các đối tượng không tuân theo quy lut thông
thường. Phm vi ca chúng được điu khin bi các lp trình viên.
Tham chiếu (reference) cung cp mt tên tượng trưng cho đối tượng, gi là alias
(tên đại din). Truy xut mt đối tượng thông qua mt tham chiếu ging như truy xut
thông qua tên ca đối tượng. Tham chiếu nâng cao tính hu dng ca con tr và s tin
li ca vic truy xut trc tiếp các đối tượng. Chúng được s dng để h tr gi thông
qua tham chiếu ca các tham s hàm đặc bit khi các đối tượng ln được truyn ti hàm.
2. Biến
Khái nim con tr trong ngôn ng C/C++ là mt phn quan trng và khá phc tp,
mang li rt nhiu tin li cũng như rc ri. Nếu như mun gii thích cn k v vai trò,
chc năng, hot động cũng như nhng khái nim khác liên quan ti con tr thì tôi e rng
cn khong vài chương sách mi đủ. Tôi tm mượn câu nói “Ngôn ng C/C++ không
phi ch có con tr, nhưng nếu chưa hiu v con tr thì k như chưa hc C/C++để nói
lên vài trò ca con tr. Bi vì nhiu khái nim khác trong C liên quan mt thiết ti con tr
như: chui ký t, mng, hàm CallBack, các kiu d liu tru tượng như danh sách liên
kết, cu trúc cây, ... và m rng ra trong C++ như lp, các hàm thành viên, V-Table, ...
a) Biến
Để hiu được con tr thì trước tiên bn phi hiu v biến. Trong C/C++, biến là mt
vùng trong b nh, do đó mi biến đều có 1 địa ch. Khi bn khai báo mt biến, bn phi
cung cp tên biến, kiu d liu ca biến đó. Khi bn mun thao tác vi mt biến thì bn
s dng tên gi ca nó, còn kiu d liu giúp cho trình biên dch biết là biến đó cn bao
nhiêu byte trong b nh và nó s cp phát vùng nh tương ng cho biến đó. Ví d, bn
khai báo 1 biến kiu integer:
int var;
Trang 3
Re verse Engineering Associa t ion
Tham kho toàn din v Con tr trong C/C++
NhatPhuongLe
w w w .rea on line .n et
Khi biên dch ti đây, trình biên dch s cp phát b nh cho biến var này là 2 byte
hoc 4 bytes (tùy thuc vào kiến trúc máy tính). Gi s kiu int cn 2 bytes, và trình biên
dch s gán cho biến var hai byte trong b nh bt đầu ti địa ch xxx. Sau đó, trình biên
dch s đin tên và địa ch ca biến var này vào trong mt bng (ch s dng khi biên
dch). Bn có th hiu nôm na bng này gm 2 ct: mt ct là tên biến và mt ct là địa
ch ca biến. Mi biến trong chuơng trình s chiếm mt dòng trong bng đó, khi biên dch
gp dòng lnh gán:
var = 25;
Đầu tiên, nó s tìm xem trong bng có biến nào tên là var hay không, nếu nó tìm
không thy thì nó s khai báo li là bn dùng mt biến chưa khai báo:
error Cxxx: 'i' : undeclared identifier
Nếu tìm thy biến này thì nó s đin giá tr là 25 vào 2 byte ti địa ch xxx.
b) Ví d
V cơ bn b nh máy tính là mt dãy các bytes. Mi byte được đánh địa ch c
th. Hình dưới đây tượng trưng mt dãy bytes, t địa ch 924 ti địa ch 940, trong b
nh máy tính:
Bn có chương trình như sau:
Mã lnh C Mã lnh C++
1: #include <stdio.h> 1: #include <iostream>
2: int main () 2: int main ()
3: { 3: {
4: float fl=3.14; 4: float fl=3.14;
5: printf (“%.2f\n”,fl) 5: std::count << fl << std::endl
6: return 0; 6: return 0;
7: } 7: }
Khi biên dch ti dòng (4) ca chương trình, thì trình biên dch s cp vùng nh
cho biến fl. Trong ví d này, gi s rng biến float cn 4 bytes:
Trang 4
Re verse Engineering Associa t ion
Tham kho toàn din v Con tr trong C/C++
NhatPhuongLe
w w w .rea on line .n et
Khi biến fl được s dng dòng (5), trình biên dch s làm 2 bước như sau:
+ Chương trình s tìm và ly địa ch dành cho biến fl (trong ví d này là 924)
+ Ly ni dung lưu ti địa ch 924
Tng quát lên, khi bt k mt biến nào đó được s dng, thì trình biên dch
cũng làm 2 bước trên để ly ni dung ca biến.
Minh ha giá tr ca biến được khi to lưu tr trong b nh máy tính có th b hiu
nhm. Hãy nhìn hình, giá tr 3 đựơc lưu ti địa ch 924, dm chm được lưu ti địa ch 925,
giá tr 1 được lưu ti đại ch 926, và cui cùng giá tr 4 đựơc lưu ti địa ch 927. Hãy luôn
nh rng, trong thc tế máy tính s s dng mt thut toán để chuyn đổi s kiu chm
động (float point number) 3.14 thành dãy các bit 0 và 1. Mi byte có 8 bits 0 và 1, vì thế 4
bytes float s lưu tr 32 bits 0 và 1. Bt k con s này là 3.14 hay -273.15, thì nó luôn luôn
được lưu tr trong 4 bytes b nh.
3. Con tr
d trên minh ha cho chúng ta cách khai báo, s dng cũng như biu din
chúng trên b nh như thế nào. Đây là các biến có kích thước và kiu d liu xác
định. Người ta gi các biến kiu này là biến tĩnh. Khi khai báo biến tĩnh, vic cp
phát vùng nh cho các biến này luôn luôn đưc thc hin mà không cn biết trong
quá trình thc thi chương trình có s dng hết vùng nh đã được cp hay không?
Mt khác, các biến tĩnh dng này s tn ti trong sut thi gian thc thi chương trình
mc dù có nhng biến ch đưc s dng trong sut chương trình.
Mt s hn chế có th gp phi khi s dng các biến tĩnh:
Cp phát vùng nh tha lãng phí vùng nh
Cp phát vùng nh thiếu, chương trình thc thi b li.
Để tránh nhng hn chế trên, ngôn ng C cung cp cho ta mt loi biến đặc bit
gi là biến động vi các đặc đim sau:
Ch phát sinh trong quá trình thc hin chương trình ch không phát
sinh lúc bt đầu chương trình.
Khi chy chương trình, kích thước ca biến, vùng nhđịa ch vùng
nh được cp phát cho biến có th thay đổi.
Sau khi s dng xong có th gii phóng để tiết kim ch trong b nh.
Tuy nhiên các biến động không có địa ch nht định nên ta không th truy cp đến
chúng được. Vì thế, ngôn ng C li cung cp cho ta mt loi biến đặc bit na để khc
phc tình trng này, đó là biến con tr (pointer).
Trang 5
Re verse Engineering Associa t ion