CHNG1:BINCONTR
§1.KHÁINIMCHUNG
Mtcontrlàmtbinchađachcamtbinkhác.Numtbin
chađachcamtbinkhácthìtanóibinthnht
trđnbinthhai.
Cũngnhmibinkhác,bincontrcũngphiđckhaibáotrc
khidùng.Dngtngquátđkhaibáomtbincontrlà:
type*<tênbin>
Trongđ
ó:typelàbtkìkiudliucbnthíchhpnàođcchpnhn
trongCvà<tênbin>làtêncamtbincontr.Kiudliucbnxác
đnh
kiucanhngbinmàcontrcóthchđn.Vídkhaibáobincon
trchđncácbinnguyênvàbinkiukít:
char*p;
int*x,*y;
Contrcómttrđcbit
gilàNULL.Trnàycónghĩalàcontrchatr
timtđachhplnàoc.Đdùngđctrnàychúngtaphidùng
#include<stdio.h>đuchngtrình
§2.CÁCPHÉPTOÁNVCONTR
C
cóhai phéptoánđcbitđivicontr:*và&.Phéptoán&là
phéptoántrvđachtrongbnhcabinsaunó.Víd:
p=&a;
sđtvàobinpđachtrong
bnhcabina.Đachnàykhôngcóliên
quangìđntrscabina.Nóicáchkhácđachcabinakhôngliên
quangìđnnidungcabina.
Phéptoán*là
phéptoántrvtrcabinđttiđachđcmôt
bibinđisaunó.Vídnubinachađachcabinbthì
p=*a
sđttrsca
binbvàobinp
Chngtrình11:Lpchngtrìnhins100lênmànhình
main()
{
int*p,a,b;
clrscr();
a=100;
p=&a;
b=*p;
printf(%d,b);
1
getch();
}
§3.TMQUANTRNGCADLIUKHIKHAI
BÁOBINCONTR
Cnphibođmlàcontrluônluôntrđnmtkiudliuphù
hp.Vídkhikhaibáo
contrkiuint,trìnhbiêndchshiulàcontr
baogicũngchđnmtbincóđdàilà2byte.
Taxétmtchngtrìnhnhsau:
Chngtrình12
main()
{
floatx=10.1,y;
int
*p;
clrscr();
p=&x;
y=*p;
printf(%f,y);
getch();
}
Chngtrìnhnàynhmgántrcaxchobinyvàinratrđó.Khi
biêndchchngtrìnhkhôngbáolimàchnhcnh:
Suspenciouspointerconversioninfunctionmain
Tuynhiênchngtrìnhkhônggántrxchoyđc.Lídolàtakhai
báomtcontrintvàchonótrtibinfloatx.Nhvytrìnhbiêndchs
chchuyn2
bytethôngtinchoychkhôngphi4byteđtoramts
dngfloat.
§4.CÁCBIUTHCCONTR
1. Cácphépgáncontr:Cũnggingnhbtkìmtbinnàokhác
,tacó
thdùngmtcontrvphicamtphépgánđgántrcamt
contrchomtcontrkhác.Vídtavit:
2.
Chngtrình13:
main()
{
2
intx;
int*p1,*p2;
clrscr();
p1=&x;
p2=p1;
printf(“%p”,p2);
getch();
}
Chngtrìnhnàyhinlênđachcabinxdnghexbngcách
dùngmtmãđnhdngkháccahàm
printf().%pmôtrngshinlên
mttrchatrongmtbincontrtheodngreg:xxxxvireglàtênca
mttrongcácthanhghisegmentcaCPUcònxxxxlàđachoffsettínht
đusegment.
2.Cácphéptoánshccacontr:TrongC,tachcóthdùnghaiphép
toánshctácđnglêncontrlàphép+và.Đhiuđccáigìsxyra
khithchi
nmtphéptoánshclêncontrtagisp1làmtcontrch
đnmtsnguyêncóđachlà2000.Saukhithchinbiuthc
p1++;
contrschđns
nguyênnmđach2002vìmikhităngcontrlên1
nóschđnsnguyênktipmàmisnguyênlicóđdài2byte.Điu
nàycũngđúngkhigim.Víd:
p1
;
strtisnguyênđach1998.Nhvymikhicontrtănglên1,nós
chđndliuktiptiđachnàođótutheođdàicakiudliu.C
còncho
phépcnghaytrmtsnguyênvimtcontr.Biuthc:
p1=p1+9;
slàmchocontrchtiphntth9cókiulàkiumàp1trti
vànm
sauphânthinthinóđangtrđn.Ngoàicácphéptoántrên,contr
khôngchpnhnmtphéptoánnàokhác.
3.Sosánhcáccontr:Chúngtacóthsosánh2contrtrong
mtbiuthc
quanh.Vídchohaipvàq,phátbiusauđâylàhpl:
if(p<q)
printf(“ptrodenmotvitribonhothaphonq\n”);
Tuynhiêncnnhrngphéptoántrênlà
sosánhhaiđachchatrongp
vàqchkhôngphinidungcahaibinmàpvàqtrti.
3
4.Cácvídvvicdùngcontr:
Chngtrình14:Phântíchchngtrìnhsau:
main()
{
inti,j,*p;
i=5;
p=&i;
j=*p;
*p=j+2;
}
Trongchngtrìnhtrêntakhaibáohaibinnguyênlàivà
jvàmt
bincontrptrtimtsnguyên.Chngtrìnhsphânphibnhcho
3binnàyvídticácđach100,102và104vìmisnguyêndài2byte
vàcon
trmcnhiêncũngđcmãhoábng2byte.
100 i
102 j
104 p
lnhi=5chotrscabinilà5
100 5 i
102 j
104 p
lnhp=&ilàmchocontrchtibininghĩalàcontrpchađachca
bini.Bâygipchđnbini.
100 5 i
102 j
104 100 p
lnhj=*pđtnidungcabindopchti(bini)vàobinjnghĩalàgán
5choj
100 5 i
102 5 j
104 100 p
4
Mttrongnhngvnđlíthúkhidùngcontrlàxemnidungb
nhcamáytính.Chngtrìnhsauđâychophéptavàođachbtđu
caRAMmàtamunkhosátvàsauđó
hinlênnidungmibytedng
shex.Trongchngtrìnhcótkhoáfardùngđthamkhođncácvtrí
khôngnmtrongcùngmtsegment.
Chngtrình15:
main()
{
unsignedlongintstart;
char*p;
intt;
clrscr();
printf(Nhapvaodiachibatdaumabanmuonxem:);
scanf(%lu,&start);
p=(charfar*)start;
for(t=0;;t++,p++)
if(!(t%16))
{
printf(%2x\n,*p);
getch();
}
}
Trongchngtrìnhtadùngđnhd
ng%xtronghàmprintf()đinra
sdnghex.Dòngp=(charfar*)start;dùngbinđisnhpvàothành
mtcontr.
§5.CONTRVÀMNG
Trong chng trc chúng tađã thy các ví
d v mng. Con tr
thngđcdùngkhixlímng.Chúngtaxétchngtrìnhsau:
Chngtrình16:
main()
{
inta[10],*pa,x;
a[0]=11;
a[1]=22;
a[2]=33;
a[3]=44;
5
clrscr();
pa=&a[0];
x=*pa;
pa++;
x=*pa;
x=*pa+1;
x=*(pa+1);
x=*++pa;
x=++*pa;
x=*pa++;
}
inta[10],*pa,x; khaibáomtbnggm10phntkiuint,đclitkêlà
a[0],a[1], ,a[9],mt
contrđchđnmtbinkiuintvàmtbinkiu
intlàx.
a[0]=11...;ta[4]đna[9]chađckhigán.Nhvychúngschatr
ngunhiênđãcóti
nhngvtríbnhđãphânphichochúng.
pa=&a[0];đtvàopađachcaphntđutiêncamng.Biuthcnày
cóthvitđnginlàpa=a;vìtênc
amtmngluônluônđctrình
biêndchcoilàđachcaphntđutiêncamng.Têncamngkhông
cóchskèmtheocóthđcdùngtrongchngtrìnhnhmthng
đa
ch.
x=*pa;đtnidungcabinnguyênmàpatrđnvào(tclàa[0])vàox.
Nhvyx=11
pa++;pađctănglên1vàbâygitrvàophntth2ca
mngtclà
chađachcaphnta[1]
x=*pa;patrđnphnta[1]nênx=22
x=*pa+1;x=23
x=*(pa+1);trchtpa+1đcthchin,nghĩa
làpatrvàoa[2],sauđó
nidungcaa[2]đcgánchoxnênx=33.Tuypathamgiavàophéptoán
nhngtrscanókhôngthayđi.
x = *++pa;++đcthchintrcnên
patrtia[2].Sauđótrcaa[2]
đcgánchoxnênx=33
x= ++*pa; *pađc thc hin trc. Do pa ch đn a[2] nên *pa = 33 và
++*pa=34.Nhvyx=34vàa[2]=34
x=*pa++;nidungcapa(tc34)đcđtvàox.Sauđónóđctănglên1
nênchvàoa[3].
Chngtrình17:
6
main()
{
staticintnum[]={92,81,70,69,58};
intdex;
clrscr();
for(dex=0;dex<5;dex++)
printf(%d\n,num[dex]);
getch();
}
Chngtrình18:
main()
{
staticintnum[]={92,81,70,69,58};
intdex;
clrscr();
for(dex=0;dex<5;dex++)
printf(%d\n,*(num+dex));
getch();
}
Haichng trìnhchkhácnhaubi
uthc: *(num+dex).Cáchvit
nàytngđngvinum[dex].Nóicáchkháctruycpđnphntcóch
sdextrongmngnum.Chúngtahiu*(num+dex)nhsau:đutiênnum
làđachcaphntđu
tiêncamngnumvàtamunbittrsca
phntcóchsdex.Vìvynum+dexslàđachcaphntthdex.
*(num+dex)xácđnhnidungcaphnt
(num+dex).Tómli:
*(array+index)tngtarray(index)
Cóhaicáchtruycpmnglà:
theokíhiumng &array[index]
theokíhiucontr array+index
Chngtrình19:Tínhnhitđtrungbìnhbngcáchdùngcontr
main()
{
floattemp[40];
floatsum=0.0;
intnum,day=0;
clrscr();
do
7
{
printf(Chonhietdongaythu%d:,day+1);
scanf(%f,temp+day);
}
while(*(temp+day++)>0);
num=day1;
for(day=0;day<num;day++)
sum+=*(temp+day);
printf(Nhietdotrungbinhla:%.3f,sum/num);
getch();
}
Trongvídtrênchúngtađãdùngbiuthc(temp+day)đtruy
cpmng.
Tuynhiênvitwhile((*temp++)>0)vìtemplàhngcontrchkhôngphi
bincontr.Nhvychđcphépthayđitrcabincontrchkhông
đcthayđitrcahng
contr.Chúngtavitlichngtrìnhnhsau:
Chngtrình110:
main()
{
floattemp[40];
floatsum=0.0;
intnum,day=0;
float*p;
clrscr();
p=temp;
do
{
printf(Chonhietdongaythu%d:,day+1);
scanf(%f,p);
day++;
}
while(*(p++)>0);
p=temp;
num=day1;
for(day=0;day<num;day++)
sum+=*(p++);
printf(Nhietdotrungbinhla:%.3f,sum/num);
getch();
8
}
Trongchngtrìnhnàyđachcatempđcđavàobincontrp.Sau
đótathamkhotipgingnhtemp.Tadùngptrtimngvà*plàni
dungcađach
đó.Hnnado plàbincontrnêntacóthtăngnó
bngphátbiup++.
§6.CONTRVÀCHUI
RtnhiuhàmthvintrongClàmvicvichuitheocon
tr.Víd
hàmstrchr()trvcontrtrđnlnxuthinđutiêncamtkítnào
đótrongchuiVíd:ptr=strchr(str,’x’);thìbincontrptrsđcgánđa
chca
lnxuthinkít‘x’đutiêntrongchuistr.
Sauđâylàchngtrìnhchophéptagõvàomtcâuvàmtkítcnđnh
vtrongcâu.Chngtrìnhschota:
đachbt
đucachui
đachcakítcnđnhv
đlchsoviđimđuchui
Chngtrình111:
#include<string.h>
main()
{
charch,line[81],*ptr;
clrscr();
printf(Chomotcau:);
gets(line);
printf(Cho
kitucantim:);
ch=getche();
ptr=strchr(line,ch);
printf(\nChuoibatdautaidiachi%u.\n,line);
printf(Kituxuathienlandautai%u.\n,ptr);
printf(Dolavitri%d,(ptrline+1));
getch();
}
Chuicũngcóthđckhit
obngcontr.Taxétvídsau:
Chngtrình111:
main()
{
char*chao=Xinchao!;
9
charten[30];
clrscr();
printf(Chotencuaban:);
gets(ten);
printf(chao);
puts(ten);
getch();
}
Trongchngtrìnhtrêntađãkhitochuibngphátbiu
char*chao=“Xinchao!”
thaycho
staticcharchao[]=”
Xinchao!”
C hai cáchđucho cùng mtktqu. Trong phng án dùng con tr ,
chaolàbincontrnêncóththayđiđc.Vídphátbiu:
puts(++chao)
schoktqu:inchao!
Nutacómtmngchuitacũngcóthdùngmngcontrtrti
mngchuinày.Takhitochúnggingnhkhitobincontrđn.
Chngtrình1
12:
#define max 5
main()
{
intdex;
intenter=0;
charname[40];
staticchar*list[max]=
{
Hung,
Ngan,
Van,
Hoa,
Tien
};
clrscr();
printf(Chotencuaban:);
gets(name);
for(dex=0;dex<max;dex++)
10
if(strcmp(list[dex],name)==0)
enter=1;
if(enter==1)
printf(BandadangkihoclopC);
else
printf(Banchuadangkivaolop);
getch();
}
Phátbiuchar*list[max]nóirnglistlàmtmngcontrgmmax
phnt
chticáckít.Chúngtaxéttipmtvídnhsau:
Chngtrình113:Nhpvàomtdãytênvàspxpliđúngthta,b,c
#definemaxnum38
#definemaxlen81
main()
{
staticcharname[maxnum][maxlen];
char*ptr[maxnum];
char*temp;
intcount=0;
intin,out;
clrscr();
while(count<maxnum)
{
printf(Banchoten:);
gets(name[count]);
if(strlen(name[count])==0)
break;
ptr[count++]=name[count];
}
for(out=0;out<count1;out++)
for(in=out+1;in<count;in++)
if(strcmp(ptr[out],ptr[in])>0)
{
temp=ptr[in];
ptr[in]=ptr[out];
ptr[out]=temp;
}
printf(Danhsachdasapxep:\n);
11
for(out=0;out<count;out++)
printf(Tenthu%d:%s\n,out+1,ptr[out]);
getch();
}
Chngtrìnhnàydùngcmngchuivàmngcontrchui.Contr
nmtrongmngđckhaibáonhsau:
char*ptr[maxnum]
chuinmtrongmng
haichiu
staticcharname[maxnum][maxlen]
Dotakhôngbitmtchuidàibaonhiêunênphidùngmngchuiname
cótiđamaxnumphnt,miphntcómaxlenkít.Khinhpchu
i
phátbiu:
ptr[count++]=name[count
sgánđachcamichuiđcctgitrongmngname[][]vàophnt
contrptr.Sauđómngcontrnàyđcspxpdatrênmngname[][]
nhngmngname[][]khôngthayđigìc.
NgônngCcóthxlícácthànhphncamngnhmtmng.C
thCcóthxemmtdòngcamnghaichiunhlàm
tmngmtchiu.
điu này rt tin li nh tađthy trong chng trình trên. Câu lnh
ptr[count++]=name[counthoàntoànhplívìvphichínhlàđachca
mngname[count]và
mngnàylàmtthànhphncamngname[][]là
mtmnghaichiu.Taxemlikhaibáo:
staticcharname[maxnum][maxlen]
rõràngtacóthxemđâylàmtmngmtchiucómaxnumchu
ivàtham
khotiphntcamngmtchiubng1chs.Víd:
name[count]vicount<=maxnum
nhth:
name[0]:đachcachui1
name[1]:đachca
chui2
§7.CONTRCHĐNCONTR
Chúngtacómtchngtrìnhinramtbngsđcvitnhsau:
Chngtrình114:
#definerow4
#definecol5
main()
{
staticinttable[row][col]={
12
{13,15,17,19,21},
{20,22,24,26,28},
{31,33,35,37,39},
{40,42,44,46,48}
};
intc=10;
inti,j;
clrscr();
for(i=0;i<row;i++)
for(j=0;j<col;j++)
table[i][j]+=c;
for(i=0;i<row;i++)
{
for(j=0;j<col;j++)
printf(%5d,table[i][j]);
printf(\n);
}
getch();
}
Trongchngtrìnhtrêntadùngkíhiumng.Bâygitamu
nvit
chngtrìnhdùngkíhiucontrthaychokíhiumng.Vythìlàmth
nàođmôttable[i][j]bngcontr.Tathyrng:
tablelàđachcaphntđutiênc
atoànbmng,giđnhlà
1000
dođâylàmngnguyênnênmiphntchim2bytevàmidòng
chim10bytevìcó5phnt.Nhvyđachcahaidòngli
nnhaucách
nhau10byte
docóthxemmidònglàmtmngmtchiunêncácmngmt
chiulinnhaucáchnhau10byte
trìnhbiêndchbitscttrongmng
quakhaibáonênnóshiu
table+1làđemtable(tr1000)cngvi10bytethành1010.Tngttable+2
chota1020.
1000 13 15 17 19 21 table[0]
table==100
0
1010 20 22 24 26 28 table[1]
1020 31 33 35 37 39 table[2]
1030 40 42 44 46 48 table[3]
13
Đthamkhođntngphntcadòngtrchttaluýđach
camngcũnglàđachcaphntđutiêncamng.Vídvimng
mt
chiua[size]thìavàa[0]lànhnhau.Trlimnghaichiuđach
camngmtchiutobidòngth3camngtable[][]làtable[2]hay
table+2.Trongkíhiucontrđ
achcaphntđutiêncamngmt
chiunàylà&table[2][0]hay*(table+2).Chaicáchvittable+2và*(table
+2)đuthamkhonidungcacùngmtônh(1020).
Nucng1vào
table+3đcótable+3thìtanhnđcđachcadòngth4trongmng
table[][].Nucng1vào*(table+2)đcó*(table+2)+1thìcóđachca
phntth2trongdòngth3camngtable[][].Tómli:
table[i]=*(table+i)
&table[i]=table+i
table[i][j]=*(*table+i)+j)
&table[i][j]=(*(table+i)+j)
Nhvychngtrìnhtrênđcvitlinhsau:
Chngtrình115:
#definerow
4
#definecol5
main()
{
staticinttable[row][col]={
{13,15,17,19,21},
{20,22,24,26,28},
{31,33,35,37,39},
{40,42,44,46,48}
};
intc=10;
inti,j;
clrscr();
for(i=0;i<row;i++)
for(j=0;j<col;j++)
*(*(table+i)+j)+=c;
for(i=0;i<row;i++)
{
for(j=0;j<col;j++)
printf(%5d,*(*(table+i)+j));
printf(\n);
}
14
getch();
}
Bàitp:Lpchngtrìnhtínhhiuđdàihaichuinhpvàotbànphím
Lpchngtrìnhxácđnhgiátrccđicansnhpvàotbànphím
Lpchng
trìnhqunlíhànggmngày,lngnhp,lngxutvàhàng
tnkho
15