Ñòóäîïåäèÿ

Ãëàâíàÿ ñòðàíèöà Ñëó÷àéíàÿ ñòðàíèöà

ÊÀÒÅÃÎÐÈÈ:

ÀâòîìîáèëèÀñòðîíîìèÿÁèîëîãèÿÃåîãðàôèÿÄîì è ñàäÄðóãèå ÿçûêèÄðóãîåÈíôîðìàòèêàÈñòîðèÿÊóëüòóðàËèòåðàòóðàËîãèêàÌàòåìàòèêàÌåäèöèíàÌåòàëëóðãèÿÌåõàíèêàÎáðàçîâàíèåÎõðàíà òðóäàÏåäàãîãèêàÏîëèòèêàÏðàâîÏñèõîëîãèÿÐåëèãèÿÐèòîðèêàÑîöèîëîãèÿÑïîðòÑòðîèòåëüñòâîÒåõíîëîãèÿÒóðèçìÔèçèêàÔèëîñîôèÿÔèíàíñûÕèìèÿ×åð÷åíèåÝêîëîãèÿÝêîíîìèêàÝëåêòðîíèêà






Ch­ng 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 ch­ng 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 ch­ng 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 tr­ng, 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 t­ng ®­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 t­ng 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 t­ng ®­ng ví i & a[0]

a+i t­ng ®­ng ví i & a[i]

*(a+i) t­ng ®­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) t­ng ®­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á t­ng ø 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µ l­u 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 ch­a 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:

Ch­ng 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:

PhÇ n tö a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2]
§Þ a chØ            

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 ®Ó l­u ®Þ a chØ. Mç i kiÓ u ®Þ a chØ cÇ n cã kiÓ u con trá t­ng ø 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Ö. Nh­ng 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 ch­ng 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. T­ng 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 ®Ó l­u tr÷ mé t ®Þ a chØ kiÓ u double.

 

Chó ý:

B¶n th©n c¸ c m¶ng con trá kh«ng dï ng ®Ó l­u tr÷ sè liÖ u. Tuy nhiª n m¶ng con trá cho phÐ p sö dô ng c¸ c m¶ng kh¸ c ®Ó l­u 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 t­ng 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 t­ng ø 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;

}

}

 



Ïîäåëèòüñÿ ñ äðóçüÿìè:

mylektsii.su - Ìîè Ëåêöèè - 2015-2024 ãîä. (0.095 ñåê.)Âñå ìàòåðèàëû ïðåäñòàâëåííûå íà ñàéòå èñêëþ÷èòåëüíî ñ öåëüþ îçíàêîìëåíèÿ ÷èòàòåëÿìè è íå ïðåñëåäóþò êîììåð÷åñêèõ öåëåé èëè íàðóøåíèå àâòîðñêèõ ïðàâ Ïîæàëîâàòüñÿ íà ìàòåðèàë