PhÇn 1 : turbo c n©ng cao vµ c++ Ch−¬ng 1 : BiÕn con trá §1. Kh¸i niÖm chung Mét con trá lµ mét biÕn chøa ®Þa chØ cña mét biÕn kh¸c. NÕu mét biÕn chøa ®Þa chØ cña mét biÕn kh¸c tth× ta nãi biÕn thø nhÊt trá ®Õn biÕn thø hai. Còng nh− mäi biÕn kh¸c, biÕn con trá còng ph¶i ®−îc khai b¸o tr−íc khi dïng.
D¹ng tæng qu¸t ®Ó khai b¸o mét biÕn con trá lµ : type *<tªn biÕn> Trong ®ã : type lµ bÊt k× kiÓu d÷ liÖu c¬ b¶n thÝch hîp nµo ®−îc chÊp nhËn trong C vµ <tªn biÕn> lµ tªn cña mét biÕn con trá. KiÓu d÷ liÖu c¬ b¶n x¸c ®Þnh kiÓu cña nh÷ng biÕn mµ con trá cã thÓ chØ ®Õn. VÝ dô khai b¸o biÕn con trá chØ ®Õn c¸c biÕn nguyªn vµ biÕn kiÓu kÝ tù: char *p; int *x,*y; Con trá cã mét trÞ ®Æc biÖt gäi lµ NULL. TrÞ nµy cã nghÜa lµ con trá ch−a trá tíi mét ®Þa chØ hîp lÖ nµo c¶.
§Ó dïng ®−îc trÞ nµy chóng ta ph¶i dïng #include <stdio.h> ®Çu ch−¬ng tr×nh §2. C¸c phÐp to¸n vÒ con trá C cã hai phÐp to¸n ®Æc biÖt ®èi víi con trá : * vµ &. PhÐp to¸n & lµ phÐp to¸n tr¶ vÒ ®Þa chØ trong bé nhí cña biÕn sau nã. VÝ dô : p = &a; sÏ ®Æt vµo biÕn p ®Þa chØ trong bé nhí cña biÕn a.
§Þa chØ nµy kh«ng cã liªn quan g× ®Õn trÞ sè cña biÕn a. Nãi c¸ch kh¸c ®Þa chØ cña biÕn a kh«ng liªn quan g× ®Õn néi dung cña biÕn a. PhÐp to¸n * lµ phÐp to¸n tr¶ vÒ trÞ cña biÕn ®Æt t¹i ®Þa chØ ®−îc m« t¶ bëi biÕn ®i sau nã. VÝ dô nÕu biÕn a chøa ®Þa chØ cña biÕn b th× p = *a sÏ ®Æt trÞ sè cña biÕn b vµo biÕn p Ch−¬ng tr×nh 1-1 : LËp ch−¬ng tr×nh in sè 100 lªn mµn h×nh main() { int *p,a,b; clrscr(); a=100; p=&a; b=*p; printf("%d",b); getch(); } §3.
TÇm quan träng cña d÷ liÖu khi khai b¸o con trá 1 CÇn ph¶i b¶o ®¶m lµ con trá lu«n lu«n trá ®Õn mét kiÓu d÷ liÖu phï hîp. VÝ dô khi khai b¸o con trá kiÓu int , tr×nh biªn dÞch sÏ hiÓu lµ con trá bao giê còng chØ ®Õn mét biÕn cã ®é dµi lµ 2 byte. Ta xÐt mét ch−¬ng tr×nh nh− sau Ch−¬ng tr×nh 1-2 main() { float x=10.1,y; int *p; clrscr(); p=&x; y=*p; printf("%f",y); getch(); } Ch−¬ng tr×nh nµy nh»m g¸n trÞ cña x cho biÕn y vµ in ra trÞ ®ã. Khi biªn dÞch ch−¬ng tr×nh kh«ng b¸o lçi mµ chØ nh¾c nhë : Suspencious pointer conversion in function main Tuy nhiªn ch−¬ng tr×nh kh«ng g¸n trÞ x cho y ®−îc.
LÝ do lµ ta khai b¸o mét con trá int vµ cho nã trá tíi biÕn float x. Nh− vËy tr×nh biªn dÞch sÏ chØ chuyÓn 2 byte th«ng tin cho y chø kh«ng ph¶i 4 byte ®Ó t¹o ra mét sè d¹ng float. C¸c biÓu thøc con trá 1. C¸c phÐp g¸n con trá : Còng gièng nh− bÊt k× mét biÕn nµo kh¸c , ta cã thÓ dïng mét con trá ë vÒ ph¶i cña mét phÐp g¸n ®Ó g¸n trÞ cña mét con trá cho mét con trá kh¸c.
VÝ dô ta viÕt Ch−¬ng tr×nh 1-3 : main() { int x; int *p1,*p2; clrscr(); p1 = &x; p2 = p1; printf(“ %p”,p2); getch(); } Ch−¬ng tr×nh nµy hiÖn lªn ®Þa chØ cña biÕn x ë d¹ng hex b»ng c¸ch dïng mét m· ®Þnh d¹ng kh¸c cña hµm printf(). %p m« t¶ r»ng sÏ hiÖn lªn mét trÞ chøa trong mét biÕn con trá theo d¹ng reg:xxxx víi reg lµ tªn cña mét trong c¸c thanh ghi segment cña CPU cßn xxxx lµ ®Þa chØ offset tÝnh tõ ®Çu segment. C¸c phÐp to¸n sè häc cña con trá : Trong C , ta chØ cã thÓ dïng hai phÐp to¸n sè häc t¸c ®éng lªn con trá lµ phÐp + vµ -. §Ó hiÓu ®−îc c¸i g× sÏ x¶y ra khi thùc hiÖn mét phÐp to¸n sè häc lªn con trá ta gi¶ sö p1 lµ mét con trá chØ ®Õn mét sè nguyªn cã ®Þa chØ lµ 2000.
Sau khi thùc hiÖn biÓu thøc 2 p1++ ; con trá sÏ chØ ®Õn sè nguyªn n»m ë ®Þa chØ 2002 v× mçi khi t¨ng con trá lªn 1 nã sÏ chØ ®Õn sè nguyªn kÕ tiÕp mµ mçi sè nguyªn l¹i cã ®é dµi 2 byte. §iÒu nµy còng ®óng khi gi¶m. VÝ dô : p1-- ; sÏ trá tíi sè nguyªn ë ®Þa chØ 1998. Nh− vËy mçi khi con trá t¨ng lªn 1 , nã sÏ chØ ®Õn d÷ liÖu kÕ tiÕp t¹i ®Þa chØ nµo ®ã tuú theo ®é dµi cña kiÓu d÷ liÖu.
C cßn cho phÐp céng hay trõ mét sè nguyªn víi mét con trá. BiÓu thøc : p1 = p1 + 9; sÏ lµm cho con trá chØ tíi phÇn tö thø 9 cã kiÓu lµ kiÓu mµ p1 trá tíi vµ n»m sau ph©n tö hiÖn thêi nã ®ang trá ®Õn. Ngoµi c¸c phÐp to¸n trªn , con trá kh«ng chÊp nhËn mét phÐp to¸n nµo kh¸c. So s¸nh c¸c con trá : Chóng ta cã thÓ so s¸nh 2 con trá trong mét biÓu thøc quan hÖ.
VÝ dô cho hai p vµ q , ph¸t biÓu sau ®©y lµ hîp lÖ : if (p<q) printf(“p tro den mot vi tri bo nho thap hon q\n”); Tuy nhiªn cÇn nhí r»ng phÐp to¸n trªn lµ so s¸nh hai ®Þa chØ chøa trong p vµ q chø kh«ng ph¶i néi dung cña hai biÕn mµ p vµ q trá tíi. C¸c vÝ dô vÒ viÖc dïng con trá : Ch−¬ng tr×nh 1-4 : Ph©n tÝch ch−¬ng tr×nh sau : main() { int i,j,*p; i=5; p=&i; j=*p; *p=j+2; } Trong ch−¬ng tr×nh trªn ta khai b¸o hai biÕn nguyªn lµ i vµ j vµ mét biÕn con trá p trá tíi mét sè nguyªn. Ch−¬ng tr×nh sÏ ph©n phèi bé nhí cho 3 biÕn nµy vÝ dô t¹i c¸c ®Þa chØ 100 , 102 vµ 104 v× mçi sè nguyªn dµi 2 byte vµ con trá mÆc nhiªn còng ®−îc m· ho¸ b»ng 2 byte. 100 i 102 j 104 p lÖnh i=5 cho trÞ sè cña biÕn i lµ 5 100 5 i 102 j 104 p lÖnh p= &i lµm cho con trá chØ tíi biÕn i nghÜa lµ con trá p chøa ®Þa chØ cña biÕn i.
B©y giê p chØ ®Õn biÕn i. 100 5 i 102 j 104 100 p 3 lÖnh j=*p ®Æt néi dung cña biÕn do p chØ tíi (biÕn i) vµo biÕn j nghÜa lµ g¸n 5 cho j 100 5 i 102 5 j 104 100 p Mét trong nh÷ng vÊn ®Ò lÝ thó khi dïng con trá lµ xem néi dung bé nhí cña m¸y tÝnh. Ch−¬ng tr×nh sau ®©y cho phÐp ta vµo ®Þa chØ b¾t ®Çu cña RAM mµ ta muèn kh¶o s¸t vµ sau ®ã hiÖn lªn néi dung mçi byte ë d¹ng sè hex. Trong ch−¬ng tr×nh cã tõ kho¸ far dïng ®Ó tham kh¶o ®Õn c¸c vÞ trÝ kh«ng n»m trong cïng mét segment.
Ch−¬ng tr×nh 1-5 : main() { unsigned long int start; char *p; int t; clrscr(); printf("Nhap vao dia chi bat dau ma ban muon xem : "); scanf("%lu",&start); p = (char far *) start; for(t=0;;t++,p++) if(!(t%16)) { printf("%2x\n",*p); getch(); } } Trong ch−¬ng tr×nh ta dïng ®Þnh d¹ng %x trong hµm printf() ®Ó in ra sè d¹ng hex. Dßng p = (char far *) start; dïng biÕn ®æi sè nhËp vµo thµnh mét con trá. Con trá vµ m¶ng Trong ch−¬ng tr−íc chóng ta ®· thÊy c¸c vÝ dô vÒ m¶ng. Con trá th−êng ®−îc dïng khi xö lÝ m¶ng.
Chóng ta xÐt ch−¬ng tr×nh sau : Ch−¬ng tr×nh 1-6 : main() { int a[10],*pa,x; a[0]=11; a[1]=22; a[2]=33; a[3]=44; clrscr(); pa=&a[0]; x=*pa; pa++; x=*pa; 4 x=*pa+1; x=*(pa+1); x=*++pa; x=++*pa; x=*pa++; } int a[10] , *pa , x; khai b¸o mét b¶ng gåm 10 phÇn tö kiÓu int , ®−îc liÖt kª lµ a[0],a[1],.,a[9] , mét con trá ®Ó chØ ®Õn mét biÕn kiÓu int vµ mét biÕn kiÓu int lµ x.; tõ a[4] ®Õn a[9] ch−a ®−îc khëi g¸n. Nh− vËy chóng sÏ chøa trÞ ngÉu nhiªn ®· cã t¹i nh÷ng vÞ trÝ bé nhí ®· ph©n phèi cho chóng. pa=&a[0]; ®Æt vµo pa ®Þa chØ cña phÇn tö ®Çu tiªn cña m¶ng. BiÓu thøc nµy cã thÓ viÕt ®¬n gi¶n lµ pa = a ; v× tªn cña mét m¶ng lu«n lu«n ®−îc tr×nh biªn dÞch coi lµ ®Þa chØ cña phÇn tö ®Çu tiªn cña m¶ng.
Tªn cña m¶ng kh«ng cã chØ sè kÌm theo cã thÓ ®−îc dïng trong ch−¬ng tr×nh nh− mét h»ng ®Þa chØ. x=*pa; ®Æt néi dung cña biÕn nguyªn mµ pa trá ®Õn vµo (tøc lµ a[0]) vµo x. Nh− vËy x = 11 pa++; pa ®−îc t¨ng lªn 1 vµ b©y giê trá vµo phÇn tö thø 2 cña m¶ng tøc lµ chøa ®Þa chØ cña phÇn tö a[1] x=*pa ; pa trá ®Õn phÇn tö a[1] nªn x = 22 x = *pa +1 ; x =23 x = *(pa+1) ; tr−íc hÕt pa+1 ®−îc thùc hiÖn , nghÜa lµ pa trá vµo a[2] , sau ®ã néi dung cña a[2] ®−îc g¸n cho x nªn x= 33 .Tuy pa tham gia vµo phÐp to¸n nh−ng trÞ sè cña nã kh«ng thay ®æi. x = *++pa; ++ ®−îc thùc hiÖn tr−íc nªn pa trá tíi a[2].
Sau ®ã trÞ cña a[2] ®−îc g¸n cho x nªn x =33 x= ++*pa; *pa ®−îc thùc hiÖn tr−íc. Do pa chØ ®Õn a[2] nªn *pa=33 vµ ++*pa=34. Nh− vËy x = 34 vµ a[2]=34 x=*pa++; néi dung cña pa (tøc 34) ®−îc ®Æt vµo x. Sau ®ã nã ®−îc t¨ng lªn 1 nªn chØ vµo a[3].
Ch−¬ng tr×nh 1-7: main() { static int num[]={92,81,70,69,58}; int dex; clrscr(); for(dex=0;dex<5;dex++) printf("%d\n",num[dex]); getch(); } Ch−¬ng tr×nh 1-8 : main() { static int num[]={92,81,70,69,58}; int dex; clrscr(); for(dex=0;dex<5;dex++) printf("%d\n",*(num+dex)); 5 getch(); } Hai ch−¬ng tr×nh chØ kh¸c nhau ë biÓu thøc : *(num+dex). C¸ch viÕt nµy t−¬ng ®−¬ng víi num[dex] .Nãi c¸ch kh¸c truy cËp ®Õn phÇn tö cã chØ sè dex trong m¶ng num. Chóng ta hiÓu *(num+dex) nh− sau : ®Çu tiªn num lµ ®Þa chØ cña phÇn tö ®Çu tiªn cña m¶ng num vµ ta muèn biÕt trÞ sè cña phÇn tö cã chØ sè dex. V× vËy num+dex sÏ lµ ®Þa chØ cña phÇn tö thø dex .0; int num,day=0; clrscr(); do { printf("Cho nhiet do ngay thu %d: ",day+1); scanf("%f",temp+day); } while(*(temp+day++)>0); num = day-1; for(day=0;day<num;day++) sum+=*(temp+day); printf("Nhiet do trung binh la : %.3f",sum/num); getch(); } Trong vÝ dô trªn chóng ta ®· dïng biÓu thøc (temp+day) ®Ó truy cËp m¶ng.
Tuy nhiªn viÕt while((*temp++)>0) v× temp lµ h»ng con trá chø kh«ng ph¶i biÕn con trá. Nh− vËy chØ ®−îc phÐp thay ®æi trÞ cña biÕn con trá chø kh«ng ®−îc thay ®æi trÞ cña h»ng con trá. Chóng ta viÕt l¹i ch−¬ng tr×nh nh− sau : Ch−¬ng tr×nh 1-10 : main() { float temp[40]; float sum=0.0; int num,day=0; float *p; clrscr(); p=temp; do { printf("Cho nhiet do ngay thu %d: ",day+1); 6 scanf("%f",p); day++; } while(*(p++)>0); p=temp; num=day-1; for(day=0;day<num;day++) sum+=*(p++); printf("Nhiet do trung binh la : %.