Ãëàâíàÿ ñòðàíèöà Ñëó÷àéíàÿ ñòðàíèöà ÊÀÒÅÃÎÐÈÈ: ÀâòîìîáèëèÀñòðîíîìèÿÁèîëîãèÿÃåîãðàôèÿÄîì è ñàäÄðóãèå ÿçûêèÄðóãîåÈíôîðìàòèêàÈñòîðèÿÊóëüòóðàËèòåðàòóðàËîãèêàÌàòåìàòèêàÌåäèöèíàÌåòàëëóðãèÿÌåõàíèêàÎáðàçîâàíèåÎõðàíà òðóäàÏåäàãîãèêàÏîëèòèêàÏðàâîÏñèõîëîãèÿÐåëèãèÿÐèòîðèêàÑîöèîëîãèÿÑïîðòÑòðîèòåëüñòâîÒåõíîëîãèÿÒóðèçìÔèçèêàÔèëîñîôèÿÔèíàíñûÕèìèÿ×åð÷åíèåÝêîëîãèÿÝêîíîìèêàÝëåêòðîíèêà |
Chng 7
Con trá Con trá lµ biÕ n chø a ®Þ a chØ cñ a mé t biÕ n kh¸ c. Con trá ®î c sö dô ng rÊ t nhiÒ u trong C, mé t phÇ n lµ do chó ng ®«i khi lµ c¸ ch duy nhÊ t ®Ó biÓ u diÔ n tÝ nh to¸ n, vµ phÇ n n÷ a do chó ng thê ng lµm cho chng tr× nh ng¾ n gä n vµ cã hiÖ u qu¶ hn c¸ c c¸ ch kh¸ c. Con trá ®· tõ ng bÞ coi nh cã h¹ i ch¼ ng kÐ m g× lÖ nh goto do c¸ ch sö dô ng chó ng ®· t¹ o ra c¸ c chng tr× nh khã hiÓ u. §iÒ u nµy ch¾ c ch¾ n lµ ®ó ng khi ngê i ta sö dô ng chó ng mé t c¸ ch l«n xé n vµ do ®ã t¹ o ra c¸ c con trá trá ®Õ n ®©u ®ã kh«ng biÕ t trí c ®î c. 7.1. Con trá vµ ®Þ a chØ: V× con trá chø a ®Þ a chØ cñ a ®è i tî ng nª n nã cã thÓ x©m nhË p vµo ®è i tî ng gi¸ n tiÕ p qua con trá. Gi¶ sö x lµ mé t biÕ n kiÓ u int, vµ gi¶ sö px lµ con trá ®î c t¹ o ra theo mé t c¸ ch nµo ®ã. PhÐ p to¸ n mé t ng«i & sÏ cho ®Þ a chØ cñ a ®è i tî ng, nª n c©u lÖ nh: px=& x; sÏ g¸ n ®Þ a chØ cñ a biÕ n x cho trá px, vµ px b©y giê ®î c gä i lµ " trá tí i biÕ n x ". PhÐ p to¸ n & chØ ¸ p dô ng ®î c cho c¸ c biÕ n vµ phÇ n tö b¶ng, kÕ t cÊ u kiÓ u & (x+1) vµ & 3 lµ kh«ng hî p lÖ. LÊ y ®¹ i chØ cñ a biÕ n register cò ng lµ sai. PhÐ p to¸ n mé t ng«i * coi lµ to¸ n h¹ ng cñ a nã lµ ®¹ i chØ cÇ n xÐ t vµ th©m nhË p tí i ®Þ a chØ ®ã ®Ó lÊ y ra né i dung. NÕ u biÕ n y cã kiÓ u int th× th× lÖ nh: y=*px; sÏ g¸ n gi¸ trÞ cñ a biÕ n mµ trá px trá tí i. VË y d·y lÖ nh: px=& x; y=*px; sÏ g¸ n gi¸ trÞ cñ a x cho y nh trong lÖ nh: y=x; C¸ c khai b¸ o cho c¸ c biÕ n con trá cã d¹ ng: tª n kiÓ u *tª n con trá VÝ dô: Nh trong vÝ dô trª n, ta khai b¸ o con trá px kiÓ u int: int *px;
Trong khai b¸ o trª n ta ®· ngô ý nã i r»ng ®ã lµ mé t c¸ ch tî ng trng, r»ng tæ hî p *px cã kiÓ u int, tø c lµ nÕ u px xuÊ t hiÖ n trong ng÷ c¶nh *px th× nã cò ng tng ®ng ví i biÕ n cã kiÓ u int. Con trá cã thÓ xuÊ t hiÖ n trong c¸ c biÓ u thø c. Ch¼ ng h¹ n, nÕ u px trá tí i sè nguyª n x th× *px cã thÓ xuÊ t hiÖ n trong bÊ t kú ng÷ c¶nh nµo mµ x cã thÓ xuÊ t hiÖ n.
VÝ dô: LÖ nh y=*px+1; sÏ ®Æ t y lí n hn x mé t ®n vÞ. LÖ nh printf(" %d", *px); sÏ in ra gi¸ trÞ hiÖ n t¹ i cñ a x
LÖ nh: d=sqrt((double) *px); sÏ g¸ n cho biÕ n d c¨ n bË c hai cñ a x, gi¸ trÞ nµy bÞ bué c ph¶i chuyÓ n sang double trí c khi ®î c chuyÒ n cho sqrt (c¸ ch dï ng hµm sqrt). Trong c¸ c biÓ u thø c kiÓ u nh: y=*px+1; phÐ p to¸ n mé t ng«i * vµ & cã mø c u tiª n cao hn c¸ c phÐ p to¸ n sè hä c, cho nª n biÓ u thø c nµy lÊ y bÊ t ký gi¸ trÞ nµo mµ px trá tí i, cé ng ví i 1 rå i g¸ n cho y. Con trá cò ng cã thÓ xuÊ t hiÖ n bª n vÕ tr¸ i cñ a phÐ p g¸ n. NÕ u px trá tí i x th× sau lÖ nh: *px=0; x sÏ cã gi¸ trÞ b»ng 0. Cò ng tng tù c¸ c lÖ nh: *px+=1; (*px)++; sÏ t¨ ng gi¸ trÞ cñ a x lª n 1 dn vÞ. C¸ c dÊ u ngoÆ c ®n ë c©u lÖ nh cuè i lµ cÇ n thiÕ t, nÕ u kh«ng th× biÓ u thø c sÏ t¨ ng px thay cho t¨ ng ë biÕ n mµ nã trá tí i v× phÐ p to¸ n mé t ng«i nh * vµ ++ ®î c tÝ nh tõ ph¶i sang tr¸ i. Cuè i cï ng, v× con trá lµ biÕ n nª n ta cã thao t¸ c chó ng nh ®è i ví i c¸ c biÕ n kh¸ c. NÕ u py cò ng lµ con trá int th× lÖ nh: py=px; sÏ sao né i dung cñ a px vµo py, nghÜ a lµ lµm cho py trá tí i ni mµ px trá. 7.2. Con trá vµ m¶ng mé t chiÒ u: Trong C cã mè i quan hÖ chÆ t chÏ gi÷ a con trá vµ m¶ng: c¸ c phÇ n tö cñ a m¶ng cã thÓ ®î c x¸ c ®Þ nh nhê chØ sè hoÆ c th«ng qua con trá.
7.2.1.PhÐ p to¸ n lÊ y ®Þ a chØ: PhÐ p to¸ n nµy chØ ¸ p dô ng cho c¸ c phÇ n tö cñ a m¶ng mé t chiÒ u. Gi¶ sö ta cã khai b¸ o: double b[20]; Khi ®ã phÐ p to¸ n: & b[9] sÏ cho ®Þ a chØ cñ a phÇ n tö b[9]. 7.2.2. Tª n m¶ng lµ mé t h»ng ®Þ a chØ: Khi khai b¸ o: float a[10]; m¸ y sÏ bè trÝ bè trÝ cho m¶ng a mê i kho¶ng nhí liª n tiÕ p, mç i kho¶ng nhí lµ 4 byte. Nh vË y, nÕ u biÕ t ®Þ a chØ cñ a mé t phÇ n tö nµo ®ã cñ a m¶ng a, th× ta cã thÓ dÔ dµng suy ra ®Þ a chØ cñ a c¸ c phÇ n tö kh¸ c cñ a m¶ng. Ví i C ta cã: a tng ®ng ví i & a[0] a+i tng ®ng ví i & a[i] *(a+i) tng ®ng ví i a[i] 7.2.3. Con trá trá tí i c¸ c phÇ n tö cñ a m¶ng mé t chiÒ u: Khi con trá pa trá tí i phÇ n tö a[k] th×: pa+i trá tí i phÇ n tö thø i sau a[k], cã nghÜ a lµ nã trá tí i a[k+i]. pa-i trá tí i phÇ n tö thø i trí c a[k], cã nghÜ a lµ nã trá tí i a[k-i]. *(pa+i) tng ®ng ví i pa[i]. Nh vË y, sau hai c©u lÖ nh: float a[20], *p; p=a; th× bè n c¸ ch viÕ t sau cã t¸ c dô ng nh nhau: a[i] *(a+i) p[i] *(p+i) VÝ dô: Vµo sè liÖ u cñ a c¸ c phÇ n tö cñ a mé t m¶ng vµ tÝ nh tæ ng cñ a chó ng: C¸ ch 1: #include " stdio.h" main() { float a[4], tong; int i; for (i=0; i< 4; ++i) { printf(" \n a[%d]=", i); scanf(" %f", a+i); } tong=0; for (i=0; i< 4; ++i) tong+=a[i]; printf(" \n Tong cac phan tu mang la: %8.2f ", tong); } C¸ ch 2: #include " stdio.h" main() { float a[4], tong, *troa; int i; troa=a; for (i=0; i< 4; ++i) { printf(" \n a[%d]=", i); scanf(" %f", & troa[i]); } tong=0; for (i=0; i< 4; ++i) tong+=troa[i]; printf(" \n Tong cac phan tu mang la: %8.2f ", tong); }
C¸ ch 3: #include " stdio.h" main() { float a[4], tong, *troa; int i; troa=a; for (i=0; i< 4; ++i) { printf(" \n a[%d]=", i); scanf(" %f", troa+i); } tong=0; for (i=0; i< 4; ++i) tong+=*(troa+i); printf(" \n Tong cac phan tu mang la: %8.2f ", tong); } Chó ý: M¶ng mé t chiÒ u vµ con trá tng ø ng ph¶i cï ng kiÓ u.
7.2.4. M¶ng, con trá vµ x©u ký tù: Nh ta ®· biÕ t trí c ®©y, x©u ký tù lµ mé t d·y ký tù ®Æ t trong hai dÊ u nh¸ y kÐ p, vÝ dô nh: " Viet nam" Khi gÆ p mé t x©u ký tù, m¸ y sÏ cÊ p ph¸ t mé t kho¶ng nhí cho mé t m¶ng kiÓ u char ®ñ lí n ®Ó chø a c¸ c ký tù cñ a x©u vµ chø a thª m ký tù '\0' lµ ký tù dï ng lµm ký tù kÕ t thó c cñ a mé t x©u ký tù. Mç i ký tù cñ a x©u ®î c chø a trong mé t phÇ n tö cñ a m¶ng. Cò ng giè ng nh tª n m¶ng, x©u ký tù lµ mé t hµng ®Þ a chØ biÓ u thÞ ®Þ a chØ ®Ç u cñ a m¶ng chø a nã. V× vË y nÕ u ta khai b¸ o biÕ n xau nh mé t con trá kiÓ u char: char *xau; th× phÐ p g¸ n: xau=" Ha noi" lµ hoµn toµn cã nghÜ a. Sau khi thù c hiÖ n c©u lÖ nh nµy trong con trá xau sÏ cã ®Þ a chØ ®Ç u cñ a m¶ng (kiÓ u char) ®ang chø a x©u ký tù bª n ph¶i. Khi ®ã c¸ c c©u lÖ nh: puts(" Ha noi"); puts(xau); sÏ cã cï ng mé t t¸ c dô ng lµ cho hiÖ n lª n mµn h× nh dß ng ch÷ Ha noi. M¶ng kiÓ u char thê ng dï ng ®Ó chø a mé t d·y ký tù ®ä c vµo bé nhí. VÝ dô, ®Ó n¹ p tõ bµn phÝ m tª n cñ a mé t ngê i ta dï ng mé t m¶ng kiÓ u char ví i ®é dµi 25, ta sö dô ng c¸ c c©u lÖ nh sau: char ten[25]; printf(" \n Ho ten: "); gets(ten); B©y giê ta xem gi÷ a m¶ng kiÓ u char vµ con trá kiÓ u char cã nh÷ ng g× giè ng vµ kh¸ c nhau. §Ó thÊ y ®î c sù kh¸ c nhau cñ a chó ng, ta ®a ra sù so s¸ nh sau: char *xau, ten[15]; ten=" Ha noi" gets(xau); C¸ c c©u lÖ nh trª n lµ kh«ng hî p lÖ. C©u lÖ nh thø hai sai ë chç: ten lµ mé t h»ng ®Þ a chØ vµ ta kh«ng thÓ g¸ n mé t h»ng ®Þ a chØ nµy cho mé t h»ng ®Þ a chØ kh¸ c. C©u lÖ nh thø ba kh«ng thù c hiÖ n ®î c, mô c ®Ý ch cñ a c©u lÖ nh lµ ®ä c tõ bµn phÝ m mé t d·y ký tù vµ lu vµo mé t vï ng nhí mµ con trá xau trá tí i. Song né i dung cñ a con trá xau cß n cha x¸ c ®Þ nh. NÕ u trá xau ®· trá tí i mé t vï ng nhí nµo ®ã th× c©u lÖ nh nµy hoµn toµn cã ý nghÜ a. Ch¼ ng h¹ n nh sau khi thù c hiÖ n c©u lÖ nh: xau=ten; th× c¸ ch viÕ t: gets(ten); vµ gets(xau); ®Ò u cã t¸ c dô ng nh nhau.
7.3. Con trá vµ m¶ng nhiÒ u chiÒ u: ViÖ c sö lý m¶ng nhiÒ u chiÒ u phø c t¹ p hn so ví i m¶ng mé t chiÒ u. Kh«ng ph¶i mä i qui t¾ c ®ó ng ví i m¶ng mé t chiÒ u ®Ò u cã thÓ ¸ p dô ng cho m¶ng nhiÒ u chiÒ u.
7.3.1.PhÐ p lÊ y ®Þ a chØ: PhÐ p lÊ y ®Þ a chØ ®è i ví i c¸ c phÇ n tö m¶ng hai chiÒ u chØ cã thÓ ¸ p dô ng khi c¸ c phÇ n tö m¶ng hai chiÒ u cã kiÓ u nguyª n, cß n l¹ i th× phÐ p lÊ y ®Þ a chØ cho c¸ c phÇ n tö m¶ng nhiÒ u chiÒ u lµ kh«ng thù c hiÖ n ®î c.VÝ dô nh ta cã thÓ lÊ y ®Þ a chØ & a[1][2] khi a lµ m¶ng nguyª n. Thñ thuË t ®ä c tõ bµn phÝ m phÇ n tö m¶ng hai chiÒ u dï ng lÖ nh scanf: Chng tr× nh ®ä c vµo sè liÖ u cho mé t ma trË n hai chiÒ u sÏ ®î c thù c hiÖ n th«ng qua viÖ c ®ä c vµo mé t biÕ n trung gian, ®ä c mé t gi¸ trÞ vµ chø a t¹ m vµo mé t biÕ n trung gian sau ®ã ta g¸ n biÕ n cho phÇ n tö m¶ng:
#include " stdio.h" main() { float a[2][3], tg; int i, j; for (i=0; i< 2; ++i) for (j=0; j< 2; ++j) { printf(" \n a[%d][%d]=", i, j); scanf(" %8.2f", & tg); a[i][j]=tg; } } 7.3.2. PhÐ p cé ng ®Þ a chØ trong m¶ng hai chiÒ u: Gi¶ sö ta cã m¶ng hai chiÒ u a[2][3] cã 6 phÇ n tö ó ng ví i s¸ u ®Þ a chØ liª n tiÕ p trong bé nhí ®î c xÕ p theo thø tù sau:
Tª n m¶ng a biÓ u thÞ ®Þ a chØ ®Ç u tiª n cñ a m¶ng. PhÐ p cé ng ®Þ a chØ ë ®©y ®î c thù c hiÖ n nh sau: C coi m¶ng hai chiÒ u lµ m¶ng (mé t chiÒ u) cñ a m¶ng, nh vË y khai b¸ o float a[2][3]; th× a lµ m¶ng mµ mç i phÇ n tö cñ a nã lµ mé t d·y 3 sè thù c (mé t hµng cñ a m¶ng). V× vË y: a trá phÇ n tö thø nhÊ t cñ a m¶ng: phÇ n tö a[0][0] a+1 trá phÇ n tö ®Ç u hµng thø hai cñ a m¶ng: phÇ n tö a[1][0] ........ 7.3.3. Con trá vµ m¶ng hai chiÒ u: §Ó lÇ n lî t duyÖ t trª n c¸ c phÇ n tö cñ a m¶ng hai chiÒ u ta cã thÓ dï ng con trá nh minh ho¹ ë vÝ dô sau: float *pa, a[2][3]; pa=(float*)a; ló c ®ã: pa trá tí i a[0][0] pa+1 trá tí i a[0][1] pa+2 trá tí i a[0][2] pa+3 trá tí i a[1][0] pa+4 trá tí i a[1][1] pa+5 trá tí i a[1][2]
VÝ dô: Dï ng con trá ®Ó vµo sè liÖ u cho m¶ng hai chiÒ u.
C¸ ch 1: #include " stdio.h" main() { float a[2][3], *pa; int i; pa=(float*)a; for (i=0; i< 6; ++i) scanf(" %f", pa+i); }
C¸ ch 2: #include " stdio.h" main() { float a[2][3], *pa; int i; for (i=0; i< 6; ++i) scanf(" %f", (float*)a+i); }
7.4. KiÓ u con trá, kiÓ u ®Þ a chØ, c¸ c phÐ p to¸ n trª n con trá: 7.4.1. KiÓ u con trá vµ kiÓ u ®Þ a chØ: Con trá dï ng ®Ó lu ®Þ a chØ. Mç i kiÓ u ®Þ a chØ cÇ n cã kiÓ u con trá tng ø ng. PhÐ p g¸ n ®Þ a chØ cho con trá chØ cã thÓ thù c hiÖ n ®î c khi kiÓ u ®Þ a chØ phï hî p ví i kiÓ u con trá. VÝ dô theo khai b¸ o: float a[20][30], *pa, (*pm)[30]; th×: pa lµ con trá float pm lµ con trá kiÓ u float [30] a lµ ®Þ a chØ kiÓ u float [30] V× thÕ phÐ p g¸ n: pa=a; lµ kh«ng hî p lÖ. Nhng phÐ p g¸ n: pm=a; 7.4.2. C¸ c phÐ p to¸ n trª n con trá: Cã 4 phÐ p to¸ n liª n quan ®Õ n con trá vµ ®¹ i chØ lµ: PhÐ p g¸ n. PhÐ p t¨ ng gi¶m ®Þ a chØ. PhÐ p truy cË p bé nhí. PhÐ p so s¸ nh. PhÐ p g¸ n: PhÐ p g¸ n chØ thù c hiÖ n ví i c¸ c con trá cï ng kiÓ u. Muè n g¸ n c¸ c con trá kh¸ c kiÓ u ph¶i dï ng phÐ p Ð p kiÓ u nh vÝ dô sau: int x; char *pc; pc=(char*)(& x); PhÐ p t¨ ng gi¶m ®Þ a chØ: §Ó minh ho¹ chi tiÕ t cho phÐ p to¸ n nµy, ta xÐ t vÝ dô sau: C¸ c c©u lÖ nh: float x[30], *px; px=& x[10]; cho con trá px lµ con trá float trá tí i phÇ n tö x[10]. KiÓ u ®Þ a chØ float lµ kiÓ u ®Þ a chØ 4 byte, nª n c¸ c phÐ p t¨ ng gi¶m ®Þ a chØ ®î c thù c hiÖ n trª n 4 byte. V× thÕ: px+i trá tí i phÇ n tö x[10+i] px-i trá tí i phÇ n tö x[10-i] XÐ t vÝ dô kh¸ c: Gi¶ sö ta khai b¸ o: float b[40][50]; Khai b¸ o trª n cho ta mé t m¶ng b gå m c¸ c dß ng 50 phÇ n tö thù c. KiÓ u ®Þ a chØ cñ a b lµ 50*4=200 byte. Do vË y: b trá tí i ®Ç u dß ng thø nhÊ t (phÇ n tö b[0][0]). b+1 trá tí i ®Ç u dß ng thø hai (phÇ n tö b[1][0]). .......... b+i trá tí i ®Ç u dß ng thø i (phÇ n tö b[i][0]).
PhÐ p truy cË p bé nhí: Con trá float truy nhË p tí i 4 byte, con trá int truy nhË p 2 byte, con trá char truy nhË p 1 byte. Gi¶ sö ta cã c¸ khai b¸ o:
float *pf; int *pi; char *pc;
Khi ®ã: NÕ u trá pi trá ®Õ n byte thø 100 th× *pf biÓ u thÞ vï ng nhí 4 byte liª n tiÕ p tõ byte 100 ®Õ n 103. NÕ u trá pi trá ®Õ n byte thø 100 th× *pi biÓ u thÞ vï ng nhí 2 byte liª n tiÕ p tõ byte 100 ®Õ n 101. NÕ u trá pc trá ®Õ n byte thø 100 th× *pc biÓ u thÞ vï ng nhí 1 byte chÝ nh lµ byte 100.
PhÐ p so s¸ nh: Cho phÐ p so s¸ nh c¸ c con trá cï ng kiÓ u, vÝ dô nÕ u p1 vµ p2 lµ c¸ c con trá cï ng kiÓ u th× nÕ u: p1< p2 nÕ u ®Þ a chØ p1 trá tí i thÊ p hn ®Þ a chØ p2 trá tí i. p1=p2 nÕ u ®Þ a chØ p1 trá tí i cò ng lµ ®Þ a chØ p2 trá tí i. p1> p2 nÕ u ®Þ a chØ p1 trá tí i cao hn ®Þ a chØ p2 trá tí i. VÝ dô: VÝ dô 1: §o¹ n chng tr× nh tÝ nh tæ ng c¸ c sè thù c dï ng phÐ p so s¸ nh con trá:
float a[100], *p, *pcuoi, tong=0.0; int n; pcuoi=a+n-1; /* §Þ a chØ cuè i d·y*/ for (p=a; p< =pcuoi; ++p) s+=*p;
VÝ dô 2: Dï ng con trá char ®Ó t¸ ch c¸ c byte cñ a mé t biÕ n nguyª n, ta lµm nh sau: Gi¶ sö ta cã lÖ nh: unsigned int n=0xABCD; /* Sè nguyª n hÖ 16*/ char *pc; pc=(char*)(& n);
Khi ®ã: *pc=0xAB (byte thø nhÊ t cñ a n) *pc+1=0xCD (byte thø hai cñ a n)
7.4.3. Con trá kiÓ u void: Con trá kiÓ u void ®î c khai b¸ o nh sau: void *tª n_con_trá; §©y lµ con trá ®Æ c biÖ t, con trá kh«ng kiÓ u, nã cã thÓ nhË n bÊ t kú kiÓ u nµo. Ch¼ ng h¹ n c©u lÖ nh sau lµ hî p lÖ: void *pa; float a[20][30]; pa=a;
Con trá void thê ng dï ng lµm ®è i ®Ó nhË n bÊ t kú ®Þ a chØ kiÓ u nµo tõ tham sè thù c. Trong th©n hµm ph¶i dï ng phÐ p chuyÓ n ®æ i kiÓ u ®Ó chuyÓ n sang d¹ ng ®Þ a chØ cÇ n sö lý.
Chó ý: C¸ c phÐ p to¸ n t¨ ng gi¶m ®Þ a chØ, so s¸ nh vµ truy cË p bé nhí kh«ng dï ng ®î c trª n con trá void. VÝ dô: ViÕ t hµm thù c hiÖ n c«ng ma trË n:
void congmt(void *a, void *b, void *c, int N, int N, int m); { float *pa, *pb, *pc; int i, j; pa=(float*)a; pb=(float*)b; pc=(float*)c; for (i=1; i< m; ++i) for (j=1; j< m; ++j) *(pc+i*N+j)=*(pa+i*N+j)+*(pb+i*N+j); } V× ®è i lµ con trá void nª n nã cã thÓ nhË n ®î c ®Þ a chØ cñ a c¸ c ma trË n trong lê i gä i hµm. Tuy nhiª n ta kh«ng thÓ sö dô ng trù c tiÕ p c¸ c ®è i con trá void trong th©n hµm mµ ph¶i chuyÓ n kiÓ u cñ a chó ng sang thµnh float.
7.5. M¶ng con trá: M¶ng con trá lµ sù më ré ng kh¸ i niÖ m con trá. M¶ng con trá lµ mé t m¶ng mµ mç i phÇ n tö cñ a nã chø a ®î c mé t ®Þ a chØ nµo ®ã. Cò ng giè ng nh con trá, m¶ng con trá cã nhiÒ u kiÓ u: Mç i phÇ n tö cñ a m¶ng con trá kiÓ u int sÏ chø a ®î c c¸ c ®Þ a chØ kiÓ u int. Tng tù cho c¸ c m¶ng con trá cñ a c¸ c kiÓ u kh¸ c. M¶ng con trá ®î c khai b¸ o theo mÉ u: KiÓ u *Tª n_m¶ng_con_trá [N]; Trong ®ã KiÓ u cã thÓ lµ int, float, double, char... cß n Tª n_m¶ng_con_trá lµ tª n cñ a m¶ng, N lµ mé t h»ng sè nguyª n x¸ c ®Þ nh ®é lí n cñ a m¶ng. Khi gÆ p khai b¸ o trª n, m¸ y sÏ cÊ p ph¸ t N kho¶ng nhí liª n tiÕ p cho N phÇ n tö cñ a m¶ng Tª n_m¶ng_con_trá.
VÝ dô: LÖ nh: double *pa[100]; Khai b¸ o mé t m¶ng con trá kiÓ u double gå m 100 phÇ n tö. Mç i phÇ n tö pa[i] cã thÓ dï ng ®Ó lu tr÷ mé t ®Þ a chØ kiÓ u double.
Chó ý: B¶n th©n c¸ c m¶ng con trá kh«ng dï ng ®Ó lu tr÷ sè liÖ u. Tuy nhiª n m¶ng con trá cho phÐ p sö dô ng c¸ c m¶ng kh¸ c ®Ó lu tr÷ sè liÖ u mé t c¸ ch cã hiÖ u qu¶ hn theo c¸ ch: chia m¶ng thµnh c¸ c phÇ n vµ ghi nhí ®Þ a chØ ®Ç u cñ a mç i phÇ n vµo mé t phÇ n tö cñ a m¶ng con trá. Trí c khi sö dô ng mé t m¶ng con trá ta cÇ n g¸ n cho mç i phÇ n tö cñ a nã mé t gi¸ trÞ. Gi¸ trÞ nµy ph¶i lµ gi¸ trÞ cñ a mé t biÕ n hoÆ c mé t phÇ n tö m¶ng. C¸ c phÇ n tö cñ a m¶ng con trá kiÓ u char cã thÓ ®î c khë i ®Ç u b»ng c¸ c x©u ký tù.
VÝ dô: XÐ t mé t tæ lao ®é ng cã 10 ngê i, m· cñ a mç i ngê i chÝ nh lµ sè thø tù. Ta lË p mé t hµm ®Ó khi biÕ t m· sè cñ a nh©n viª n th× x¸ c ®Þ nh ®î c hä tª n cñ a nh©n viª n ®ã. #include " stdio.h" #include " ctype.h" void tim(int code); main() { int i; tt: printf(" \n Tim nguoi co so TT la: "); scanf(" %d", & i); tim(i); printf(" Co tiep tuc nua khong C/K: '); if (tupper(getch())='C') goto tt; } void tim(int code); { static char *list[]= { " Khong co so thu tu nay " " Nguyen Van Toan" " Huynh Tuan Nghia" " Le Hong Son" " Tran Quang Tung" " Chu Thanh Tu" " Mac Thi Nga" " Hoang Hung" " Pham Trong Ha" " Vu Trung Duc" " Mai Trong Quat" }; printf(" \n\n Ma so: %d", code); printf(": %s", ()); } 7.6. Con trá tí i hµm: 7.6.1. C¸ ch khai b¸ o con trá hµm vµ m¶ng con trá hµm: Ta sÏ tr× nh bµy quy t¾ c khai b¸ o th«ng qua c¸ c vÝ dô: VÝ dô 1: C©u lÖ nh: float (*f)(float), (*mf[50])(int); §Ó khai b¸ o:
· f lµ con trá hµm kiÓ u float cã ®è i lµ float · mf lµ m¶ng con trá hµm kiÓ u float cã ®è i kiÓ u int (cã 50 phÇ n tö)
VÝ dô 2: C©u lÖ nh: double (*g)(int, double), (*mg[30])(double, float); §Ó khai b¸ o:
· g lµ con trá hµm kiÓ u double cã c¸ c ®è i kiÓ u int vµ double · mg lµ m¶ng con trá hµm kiÓ u double cã c¸ c ®è i kiÓ u double vµ float (cã 30 phÇ n tö)
7.6.2. T¸ c dô ng cñ a con trá hµm: Con trá hµm dï ng ®Ó chø a ®Þ a chØ cñ a hµm. Muè n vË y ta thù c hiÖ n phÐ p g¸ n tª n hµm cho con trá hµm. §Ó phÐ p g¸ n cã ý nghÜ a th× kiÓ u hµm vµ kiÓ u con trá ph¶i tng thÝ ch. Sau phÐ p g¸ n, ta cã thÓ dï ng tª n con trá hµm thay cho tª n hµm.
VÝ dô 1: #include " stdio.h" double fmax(double x, double y) /* TÝ nh max x, y */ { return(x> y? x: y); } double (*pf)(double, double)=fmax; /*Khai b¸ o vµ g¸ n tª n hµm cho con trá hµm */ main() /* Sö dô ng con trá hµm*/ { printf(" \n max=%f", pf(5.0, 9.6)); }
VÝ dô 2: #include " stdio.h" double fmax(double x, double y) /* TÝ nh max x, y */ { return(x> y? x: y); } double (*pf)(double, double); /* Khai b¸ o con trá hµm*/
main() /* Sö dô ng con trá hµm*/ { pf=fmax; printf(" \n max=%f", pf(5.0, 9.6));
}
7.6.3. §è i cñ a con trá hµm: C cho phÐ p thiÕ t kÕ c¸ c hµm mµ tham sè thù c trong lê i gä i tí i nã l¹ i lµ tª n cñ a mé t hµm kh¸ c. Khi ®ã tham sè h× nh thø c tng ø ng ph¶i lµ mé t con trá hµm.
C¸ ch dï ng con trá hµm trong th©n hµm: NÕ u ®è i ®î c khai b¸ o:
double (*f)(double, int);
th× trong th©n hµm ta cã thÓ dï ng c¸ c c¸ ch viÕ t sau ®Ó x¸ c ®Þ nh gi¸ trÞ cñ a hµm (do con trá f trá tí i): f(x, m) hoÆ c (f)(x, m) hoÆ c (*f)(x, m) ë ®©y x lµ biÕ n kiÓ u double cß n m lµ biÕ n kiÓ u int.
VÝ dô: Dï ng m¶ng con trá ®Ó lË p b¶ng gi¸ trÞ cho c¸ c hµm: x*x, sin(x), cos(x), exp(x) vµ sqrt(x). BiÕ n x chay tõ 1.0 ®Õ n 10.0 theo bí c 0.5 #include " stdio.h" #include " math.h" double bp(double x) /* Hµm tÝ nh x*x */ { return x*x; } main() { int i, j; double x=1.0; typedef double (*ham)(double); ham f[6]; /* Khai bao m¶ng con trá hµm*/ /* Cã thÓ khai b¸ o nh sau double (*f[6](double)*/ f[1]=bp; f[2]=sin; f[3]=cos; f[4]=exp; f[5]=sqrt; /* G¸ n tª n hµm cho c¸ c phÇ n tö mÈ ng con trá hµm */ while (x< =10.0) /* LË p b¶ng gi¸ trÞ */ { printf(" \n"); for (j=1; j< =5; ++j) printf(" %10.2f ", f[j](x)); x+=0.5; } }
|