Professional Documents
Culture Documents
Bài 2 - Pointer in C (Con Trỏ)
Bài 2 - Pointer in C (Con Trỏ)
Con tr
n lc chng ta tm hiu v con tr. Hy ra ht mt hi tht su trc khi bt u v ti bit
bi hc ny chc chn s khng khin bn thy th v. Nhng con tr l mt khi nim c s
dng rt thng xuyn trong C. Ni v tm quan trng, chng ta khng th no lp trnh trn ngn
ng C m khng dng n con tr, v bn cng tng dng n m khng bit.
Phn ln nhng ngi bt u hc C thng xuyn vp ng trong phn kin thc v con tr. V
ti hi vng bi hc ny s gip cc bn khng nm trong s . Hy tp trung gp i bnh thng
v b thm thi gian hiu r tng biu , v d c trong bi hc ny.
Mt vn nan gii
y l mt trong nhng vn ln lin quan n con tr, cc bn mi bt u thng b nhm ln,
cm thy kh khn trong vic nm vng cch hot ng v s dng.
"Con tr rt cn thit, v chng ta s thng xuyn dng n n, hy tin ti !"
Ti s cho bn xem mt v d m cc bn khng th no gii quyt c nu khng s dng n
con tr. y cng l tiu im ca bi hc ny, ti s hng dn cch gii quyt cui bi hc.
y l vn : Ti mun vit mt function tr v hai gi tr. Vic ny l khng th v mi function
ch c th tr v duy nht mt gi tr.
C code:
int function ( )
{
return giatri;
}
Nu ta khai bo function vi type int, th ta s nhn c mt s dng int (nh vo instruction
return).
Chng ta cng hc cch vit mt function khng tr v bt c gi tr no vi t kha void:
C code:
void function( )
{
}
Nhng nhn c hai gi tr tr v cng lc tht s l vic khng th. Chng ta khng th s
dng hai return cng lc.
V y l kt qu:
Console
0 gio va 90 phut
c... chng trnh khng hot ng. V sao vy?
Khi bn gi gi tr ca mt bin s vo v tr parameter ca mt function, mt bn sao ca bin s
ny c to ra. Ni cch khc, bin s "gio" trong function chuyenDoi khng phi l bin s "gio"
trong function main! N ch l bn sao!
Function chuyenDoi thc hin nhim v ca n. Trong function chuyenDoi, nhng bin s "gio"
v "phut" nhn gi tr chnh xc: 1 v 30.
Nhng sau , function kt thc khi du ngoc } ng li. Nh ta hc bi hc trc, tt c
nhng bin s to ra trong mt function s b xa i khi function kt thc. V y, bin s
gio v phut b xa i. Sau chng trnh tip tc phn tip theo ca main, v bin s gio
v phut ca main gi tr vn l 0 v 90. l l do bn tht bi!
V tip theo, hy th tm nhiu cch khc sa i chng trnh trn, nh tr v mt gi tr sau khi
kt thc function (s dng return v thay i type function thnh int), bn ch nhn c mt trong
hai gi tr bn cn. Bn khng th no nhn c cng lc hai gi tr. V bn tuyt i khng c
s dng bin s global, l do ti gii thch bi trc.
V l vn kh khn t ra
a ch trong b nh
Nhc li kin thc
Bn cn nh bi hc v nhng bin s khng?
D c hay khng, ti vn khuyn khch bn xem li phn u ca bi hc, phn "Cng vic ca
b nh".
Trong c mt biu kh quan trng m ti cn nhc li trc khi dy bn nhng kin thc
mi:
a ch v gi tr
Khi bn to ra mt bin s tuoi type int, ly v d:
C code:
int tuoi = 10;
... chng trnh ca bn s yu cu h iu hnh (v d l Windows) quyn s dng mt t b nh.
H iu hnh s tr li bng cch a ra a ch b nh c php cha con s bn cn.
y cng l mt trong nhng nhim v chnh ca h iu hnh:
Khi chng ta yu cu mn b nh cho chng trnh. My tnh ging nh ng ch, n iu hnh
tng chng trnh v kim tra xem chng c quyn s dng b nh ti v tr c cp hay khng.
V y l mt trong nhng nguyn nhn khin my tnh bn b : Nu chng trnh t nhin
hot ng trn mt vng b nh khng cho php. H iu hnh (OS) s t chi v dng ngay
chng trnh, ging nh ni vi bn "My ngh ai l ch y?" Ngi dng, s nhn thy mt
ca s hin ln thng bo dng "Chng trnh b dng li do thc hin mt cng vic khng c
php".
Quay tr li vi bin s tuoi. Gi tr 10 c a vo mt v tr no trong b nh, ly v d n
c a vo a ch 4655. V iu xy ra y l (nhim v ca compiler), t tuoi trong chng
trnh s thay th bng a ch 4655 khi c chy.
Vic ging nh, mi khi bn in vo tuoi trong code source, chng s c chuyn thnh
4655, v my tnh s bit c cn n a ch no trong b nh ly gi tr . V ngay sau ,
my tnh xem gi tr c cha trong a ch 4655 v tr li chng ta "bin s tuoi co gi tr l
10"!
V ly gi tr mt bin s, n gin ch cn nh tn ca bin s vo code source. Nu ta
mun hin th tui, ta c th s dng function printf:
C code:
printf ("Bien so tuoi co gia tri la : %d", tuoi);
Khng c iu g mi vi dng code trn ng ko.
Khuyn mi thm!
Bn bit cch hin th gi tr ca mt bin s, nhng bn c bit chng ta cng c th hin th
a ch ca bin s ?
...ng nhin l bn cha bit ri
hin th a ch ca mt bin s, chng ta cn s dng k hiu %p (p y vit tt ca t
pointer) trong printf. Mt khc, chng ta phi a vo printf a ch ca bin s v lm vic
ny, bn cn phi t k hiu & trc bin s (tuoi), ging nh cch ti hng dn bn s dng
scanf, xem code sau:
C code:
printf ("Dia chi cua bien so tuoi la %p", &tuoi);
Kt qu
Console
Dia chi cua bien so tuoi la 0023FF74
l a ch ca bin s tuoi trong thi im chng trnh hot ng. Vng, 0023FF74 l mt s,
n n gin ch c vit trn h hexadecimal (thp lc phn), thay v h decimal (thp phn) m
chng ta thng s dng. Nu bn thay k hiu %p thnh %d, bn s nhn c mt s thp phn
m bn bit.
Nu bn chy chng trnh ny trn my tnh ca bn, a ch s khc hon ton. Tt c ph
thuc vo phn trng c trong b nh, chng trnh bn ang dng,... Hon ton khng c kh
nng bo trc a ch no ca bin s s c cp. Nu bn th chy chng trnh lin tc nhiu
ln, a ch c th s khng i trong thi im . Nhng nu bn khi ng li my tnh, chng
trnh chc chn s hin th mt gi tr khc.
Vy chng ta s lm g vi tt c nhng th ?
Ti cn bn nm vng nhng iu sau:
Chng ta bt u tin vo th gii huyn diu ca nhng con tr. Th gii b mt ca nhng chng
trnh vit trn ngn ng C (C++)
Nu chng ta s dng k t & trc tn ca con tr, chng ta s nhn c a ch tm thy con
tr (trong trng hp ny l 3).
Nhng iu cn nm vng
y l nhng iu m bn cn hiu v nm vng trc khi tip tc bi hc:
c th hiu c 4 im chnh trn. Bn cn test nhiu ln hiu cch n hot ng. Biu
sau y gip bn c th hiu r hn:
Tt c nhng iu trn l c bn. Bn phi hc thuc lng v tt nhin phi hiu r. ng ngi c
i c li nhiu ln. ng xu h nu khng hiu ngay c bi hc khi ch c qua ln u tin,
c nhiu vn chng ta cn nhiu ngy c th hiu r v i khi cn nhiu thng c th s
dng thnh tho.
Nu bn c cm gic khng theo kp, th hy ngh n nhng bc thy trong vic lp trnh: khng
ai trong s h c th hiu r hon ton hot ng ca con tr trong ln u tin. Nu c mt ngi
nh vy tn ti, bn hy gii thiu vi ti nh.
Console
15
Function triplePointer nhn vo parameter gi tr type int * ( l mt con tr ch vo mt bin s
type int).
Trong chng trnh "Ln hn hay nh hn", chng ta s dng con tr bt chp vic bit n
l g, trong vic s dng function scanf.
Tht ra, function ny c tc dng c nhng thng tin m ngi dng nhp vo bn phm v gi
li kt qu.
scanf c th thay i trc tip gi tr ca mt bin s bng cch nhp t bn phm, ta cn a
ch ca bin s :
C code:
int soHang = 0;
scanf ("%d", &soHang);
function lm vic vi con tr ca bin s soHang v c th thay i trc tip gi tr ca soHang.
Console:
1 gio va 30 phut
Khng c g khin bn ngc nhin trong on code source ny. V nh mi khi, trnh nhng
nhm ln khng ng c, ti s gii thch nhng g din ra chc chn rng cc bn theo kp
ti, v y l mt bi hc quan trng, bn cn c gng rt nhiu hiu, v ti cng c gng ht
sc gii thch r rng gip cc bn hiu:
1. Bin s gio v phut c khi to trong function main.
2. Ta gi vo function chuyenDoi a ch ca gio v phut.
3. Function chuyenDoi nhn a ch bng cch a vo cc con tr pointerGio v pointerPhut.
Bn cn bit rng, cch gi tn con tr khng quan trng. Ti c th gi l g v p, hoc
cng c th l gio v phut.
4. function chuyenDoi thay i trc tip cc gi tr ca gio v phut trong b nh v n c
a ch ca chng trong cc con tr. V iu cn bit y, tuyt i chp hnh, l phi
t * trc tn ca con tr nu nh ta mun thay i gi tr ca gio v phut. Nu ta khng
lm vic ny, ta s thay i a ch cha trong con tr, v n chng gip ta c g.