You are on page 1of 19

Chng 7: Con tr

75
Chng 7
CON TR

Con tr l bin cha a ch ca mt bin khc. Con tr c s dng rt nhiu
trong C, mt phn l do chng i khi l cch duy nht biu din tnh ton, v
phn na do chng thng lm cho chng trnh ngn gn v c hiu qu hn cc
cch khc .
Con tr tng b coi nh c hi chng km g lnh goto do cch s dng
chng to ra cc chng trnh kh hiu. iu ny chc chn l ng khi ngi ta
s dng chng mt cch ln xn v do to ra cc con tr tr n u khng bit
trc c.

7.1. Con tr v a ch :
V con tr cha a ch ca i tng nn n c th xm nhp vo i tng
gin tip qua con tr. Gi s x l mt bin kiu int, v gi s px l con tr c to ra
theo mt cch no .
Php ton mt ngi & s cho a ch ca i tng, nn cu lnh :
px=&x;
s gn a ch ca bin x cho tr px, v px by gi c gi l " tr ti bin x ". Php
ton & ch p dng c cho cc bin v phn t bng, kt cu kiu &(x+1) v &3 l
khng hp l. Ly i ch ca bin register cng l sai.
Php ton mt ngi * coi l ton hng ca n l i ch cn xt v thm nhp
ti a ch ly ra ni dung. Nu bin y c kiu int th th lnh :
y=*px;
s gn gi tr ca bin m tr px tr ti. Vy dy lnh :
px=&x;
y=*px;
s gn gi tr ca x cho y nh trong lnh :
y=x;
Cc khai bo cho cc bin con tr c dng :
Chng 7: Con tr
76
tn kiu *tn con tr

V d :
Nh trong v d trn, ta khai bo con tr px kiu int :
int *px;

Trong khai bo trn ta ng ni rng l mt cch tng trng, rng t hp *px
c kiu int, tc l nu px xut hin trong ng cnh *px th n cng tng ng vi
bin c kiu int.
Con tr c th xut hin trong cc biu thc. Chng hn, nu px tr ti s
nguyn x th *px c th xut hin trong bt k ng cnh no m x c th xut hin.

V d :
Lnh y=*px+1;
s t y ln hn x mt n v.
Lnh printf("%d",*px);
s in ra gi tr hin ti ca x

Lnh :
d=sqrt((double) *px);
s gn cho bin d cn bc hai ca x, gi tr ny b buc phi chuyn sang double trc
khi c chuyn cho sqrt ( cch dng hm sqrt ).
Trong cc biu thc kiu nh :
y=*px+1;
php ton mt ngi * v & c mc u tin cao hn cc php ton s hc, cho nn
biu thc ny ly bt k gi tr no m px tr ti, cng vi 1 ri gn cho y.
Con tr cng c th xut hin bn v tri ca php gn. Nu px tr ti x th sau
lnh :
*px=0;
x s c gi tr bng 0. Cng tng t cc lnh:
*px+=1;
Chng 7: Con tr
77
(*px)++;
s tng gi tr ca x ln 1 dn v.
Cc du ngoc n cu lnh cui l cn thit , nu khng th biu thc s
tng px thay cho tng bin m n tr ti v php ton mt ngi nh * v ++ c
tnh t phi sang tri.
Cui cng, v con tr l bin nn ta c thao tc chng nh i vi cc bin
khc. Nu py cng l con tr int th lnh :
py=px;
s sao ni dung ca px vo py, ngha l lm cho py tr ti ni m px tr.

7.2. Con tr v mng mt chiu :
Trong C c mi quan h cht ch gia con tr v mng : cc phn t ca mng
c th c xc nh nh ch s hoc thng qua con tr.

7.2.1.Php ton ly a ch :
Php ton ny ch p dng cho cc phn t ca mng mt chiu. Gi s ta c
khai bo :
double b[20];
Khi php ton :
&b[9]
s cho a ch ca phn t b[9].

7.2.2. Tn mng l mt hng a ch :
Khi khai bo :
float a[10];
my s b tr b tr cho mng a mi khong nh lin tip, mi khong nh l 4 byte.
Nh vy, nu bit a ch ca mt phn t no ca mng a, th ta c th d dng
suy ra a ch ca cc phn t khc ca mng.
Vi C ta c :
a tng ng vi &a[0]
a+i tng ng vi &a[i]
Chng 7: Con tr
78
*(a+i) tng ng vi a[i]

7.2.3. Con tr tr ti cc phn t ca mng mt chiu :
Khi con tr pa tr ti phn t a[k] th :
pa+i tr ti phn t th i sau a[k], c ngha l n tr ti a[k+i].
pa-i tr ti phn t th i trc a[k], c ngha l n tr ti a[k-i].
*(pa+i) tng ng vi pa[i].
Nh vy, sau hai cu lnh :
float a[20],*p;
p=a;
th bn cch vit sau c tc dng nh nhau :
a[i] *(a+i) p[i] *(p+i)

V d :
Vo s liu ca cc phn t ca mt mng v tnh tng ca chng :

Cch 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);
Chng 7: Con tr
79
}

Cch 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);
}

Cch 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);
Chng 7: Con tr
80
}
tong=0;
for (i=0;i<4;++i)
tong+=*(troa+i);
printf("\n Tong cac phan tu mang la :%8.2f ",tong);
}

Ch :
Mng mt chiu v con tr tng ng phi cng kiu.

7.2.4. Mng, con tr v xu k t :
Nh ta bit trc y, xu k t l mt dy k t t trong hai du nhy
kp, v d nh :
"Viet nam"
Khi gp mt xu k t, my s cp pht mt khong nh cho mt mng kiu
char ln cha cc k t ca xu v cha thm k t '\0' l k t dng lm k t
kt thc ca mt xu k t. Mi k t ca xu c cha trong mt phn t ca
mng.
Cng ging nh tn mng, xu k t l mt hng a ch biu th a ch u
ca mng cha n. V vy nu ta khai bo bin xau nh mt con tr kiu char :
char *xau;
th php gn :
xau="Ha noi"
l hon ton c ngha. Sau khi thc hin cu lnh ny trong con tr xau s c a ch
u ca mng (kiu char) ang cha xu k t bn phi. Khi cc cu lnh :
puts("Ha noi");
puts(xau);
s c cng mt tc dng l cho hin ln mn hnh dng ch Ha noi.
Mng kiu char thng dng cha mt dy k t c vo b nh. V d,
np t bn phm tn ca mt ngi ta dng mt mng kiu char vi di 25, ta s
dng cc cu lnh sau :
Chng 7: Con tr
81
char ten[25];
printf("\n Ho ten :");
gets(ten);
By gi ta xem gia mng kiu char v con tr kiu char c nhng g ging v
khc nhau. thy c s khc nhau ca chng, ta a ra s so snh sau :
char *xau, ten[15];
ten="Ha noi"
gets(xau);
Cc cu lnh trn l khng hp l. Cu lnh th hai sai ch : ten l mt hng a ch
v ta khng th gn mt hng a ch ny cho mt hng a ch khc. Cu lnh th ba
khng thc hin c, mc ch ca cu lnh l c t bn phm mt dy k t v
lu vo mt vng nh m con tr xau tr ti. Song ni dung ca con tr xau cn
cha xc nh. Nu tr xau tr ti mt vng nh no th cu lnh ny hon ton
c ngha. Chng hn nh sau khi thc hin cu lnh :
xau=ten;
th cch vit :
gets(ten) ; v gets(xau);
u c tc dng nh nhau.

7.3. Con tr v mng nhiu chiu :
Vic s l mng nhiu chiu phc tp hn so vi mng mt chiu. Khng phi
mi qui tc ng vi mng mt chiu u c th p dng cho mng nhiu chiu.

7.3.1.Php ly a ch :
Php ly a ch i vi cc phn t mng hai chiu ch c th p dng khi cc
phn t mng hai chiu c kiu nguyn, cn li th php ly a ch cho cc phn t
mng nhiu chiu l khng thc hin c .V d nh ta c th ly a ch &a[1][2]
khi a l mng nguyn.

Th thut c t bn phm phn t mng hai chiu dng lnh scanf :
Chng 7: Con tr
82
Chng trnh c vo s liu cho mt ma trn hai chiu s c thc hin
thng qua vic c vo mt bin trung gian, c mt gi tr v cha tm vo mt bin
trung gian sau ta gn bin cho phn t mng:

#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. Php cng a ch trong mng hai chiu:
Gi s ta c mng hai chiu a[2][3] c 6 phn t ng vi su a ch lin tip
trong b nh c xp theo th t sau :
Phn t a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2]
a ch 1 2 3 4 5 6
Tn mng a biu th a ch u tin ca mng. Php cng a ch y c thc
hin nh sau :
C coi mng hai chiu l mng ( mt chiu ) ca mng, nh vy khai bo
float a[2][3];
th a l mng m mi phn t ca n l mt dy 3 s thc ( mt hng ca mng ).
V vy :
a tr phn t th nht ca mng : phn t a[0][0]
a+1 tr phn t u hng th hai ca mng : phn t a[1][0]
Chng 7: Con tr
83
........

7.3.3. Con tr v mng hai chiu :
ln lt duyt trn cc phn t ca mng hai chiu ta c th dng con tr
nh minh ho v d sau :
float *pa,a[2][3];
pa=(float*)a;
lc :
pa tr ti a[0][0]
pa+1 tr ti a[0][1]
pa+2 tr ti a[0][2]
pa+3 tr ti a[1][0]
pa+4 tr ti a[1][1]
pa+5 tr ti a[1][2]

V d :
Dng con tr vo s liu cho mng hai chiu.

Cch 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);
}

Cch 2 :
#include "stdio.h"
Chng 7: Con tr
84
main()
{
float a[2][3],*pa;
int i;
for (i=0;i<6;++i)
scanf("%f",(float*)a+i);
}


7.4. Kiu con tr, kiu a ch, cc php ton trn con tr :
7.4.1. Kiu con tr v kiu a ch :
Con tr dng lu a ch. Mi kiu a ch cn c kiu con tr tng ng.
Php gn a ch cho con tr ch c th thc hin c khi kiu a ch ph hp vi
kiu con tr.
V d theo khai bo :
float a[20][30],*pa,(*pm)[30];
th :
pa l con tr float
pm l con tr kiu float [30]
a l a ch kiu float [30]
V th php gn :
pa=a;
l khng hp l. Nhng php gn :
pm=a;

7.4.2. Cc php ton trn con tr:
C 4 php ton lin quan n con tr v i ch l :
Php gn.
Php tng gim a ch.
Php truy cp b nh.
Php so snh.
Chng 7: Con tr
85

Php gn :
Php gn ch thc hin vi cc con tr cng kiu. Mun gn cc con tr khc
kiu phi dng php p kiu nh v d sau :
int x;
char *pc;
pc=(char*)(&x);

Php tng gim a ch :
minh ho chi tit cho php ton ny, ta xt v d sau :
Cc cu lnh :
float x[30],*px;
px=&x[10];
cho con tr px l con tr float tr ti phn t x[10]. Kiu a ch float l kiu a ch 4
byte, nn cc php tng gim a ch c thc hin trn 4 byte. V th :
px+i tr ti phn t x[10+i]
px-i tr ti phn t x[10-i]
Xt v d khc :
Gi s ta khai bo :
float b[40][50];
Khai bo trn cho ta mt mng b gm cc dng 50 phn t thc. Kiu a ch ca b l
50*4=200 byte.
Do vy :
b tr ti u dng th nht ( phn t b[0][0]).
b+1 tr ti u dng th hai ( phn t b[1][0]).
..........
b+i tr ti u dng th i ( phn t b[i][0]).

Php truy cp b nh :
Con tr float truy nhp ti 4 byte, con tr int truy nhp 2 byte, con tr char
truy nhp 1 byte. Gi s ta c c khai bo :
Chng 7: Con tr
86

float *pf;
int *pi;
char *pc;

Khi :
Nu tr pi tr n byte th 100 th *pf biu th vng nh 4 byte lin tip t
byte 100 n 103.
Nu tr pi tr n byte th 100 th *pi biu th vng nh 2 byte lin tip t
byte 100 n 101.
Nu tr pc tr n byte th 100 th *pc biu th vng nh 1 byte chnh l byte
100.

Php so snh :
Cho php so snh cc con tr cng kiu, v d nu p1 v p2 l cc con tr cng
kiu th nu :
p1<p2 nu a ch p1 tr ti thp hn a ch p2 tr ti.
p1=p2 nu a ch p1 tr ti cng l a ch p2 tr ti.
p1>p2 nu a ch p1 tr ti cao hn a ch p2 tr ti.

V d :
V d 1 :
on chng trnh tnh tng cc s thc dng php so snh con tr :

float a[100],*p,*pcuoi,tong=0.0;
int n;
pcuoi=a+n-1; /* a ch cui dy*/
for (p=a;p<=pcuoi;++p)
s+=*p;

V d 2 :
Chng 7: Con tr
87
Dng con tr char tch cc byte ca mt bin nguyn, ta lm nh sau :
Gi s ta c lnh :
unsigned int n=0xABCD; /* S nguyn h 16*/
char *pc;
pc=(char*)(&n);

Khi :
*pc=0xAB (byte th nht ca n)
*pc+1=0xCD (byte th hai ca n)

7.4.3. Con tr kiu void :
Con tr kiu void c khai bo nh sau :
void *tn_con_tr;
y l con tr c bit, con tr khng kiu, n c th nhn bt k kiu no.
Chng hn cu lnh sau l hp l :
void *pa;
float a[20][30];
pa=a;

Con tr void thng dng lm i nhn bt k a ch kiu no t tham s
thc. Trong thn hm phi dng php chuyn i kiu chuyn sang dng a ch
cn s l.

Ch :
Cc php ton tng gim a ch, so snh v truy cp b nh khng dng c
trn con tr void.

V d :
Vit hm thc hin cng ma trn :

void congmt(void *a,void *b,void *c,int N,int N, int m);
Chng 7: Con tr
88
{
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 nn n c th nhn c a ch ca cc ma trn trong
li gi hm. Tuy nhin ta khng th s dng trc tip cc i con tr void trong thn
hm m phi chuyn kiu ca chng sang thnh float.

7.5. Mng con tr :
Mng con tr l s m rng khi nim con tr. Mng con tr l mt mng m
mi phn t ca n cha c mt a ch no . Cng ging nh con tr, mng con
tr c nhiu kiu : Mi phn t ca mng con tr kiu int s cha c cc a ch
kiu int. Tng t cho cc mng con tr ca cc kiu khc.
Mng con tr c khai bo theo mu :
Kiu *Tn_mng_con_tr[N];
Trong Kiu c th l int, float, double, char ... cn Tn_mng_con_tr l
tn ca mng, N l mt hng s nguyn xc nh ln ca mng.
Khi gp khai bo trn, my s cp pht N khong nh lin tip cho N phn t
ca mng Tn_mng_con_tr.

V d :
Lnh :
double *pa[100];
Khai bo mt mng con tr kiu double gm 100 phn t. Mi phn t pa[i] c th
dng lu tr mt a ch kiu double.
Chng 7: Con tr
89

Ch :
Bn thn cc mng con tr khng dng lu tr s liu. Tuy nhin mng con
tr cho php s dng cc mng khc lu tr s liu mt cch c hiu qu hn theo
cch : chia mng thnh cc phn v ghi nh a ch u ca mi phn vo mt phn
t ca mng con tr.
Trc khi s dng mt mng con tr ta cn gn cho mi phn t ca n mt
gi tr. Gi tr ny phi l gi tr ca mt bin hoc mt phn t mng. Cc phn t
ca mng con tr kiu char c th c khi u bng cc xu k t.

V d :
Xt mt t lao ng c 10 ngi, m ca mi ngi chnh l s th t. Ta lp
mt hm khi bit m s ca nhn vin th xc nh c h tn ca nhn vin .
#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"
Chng 7: Con tr
90
"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 ti hm :
7.6.1. Cch khai bo con tr hm v mng con tr hm :
Ta s trnh by quy tc khai bo thng qua cc v d :

V d 1:
Cu lnh :
float (*f)(float),(*mf[50])(int);
khai bo :

f l con tr hm kiu float c i l float
mf l mng con tr hm kiu float c i kiu int ( c 50 phn t )

V d 2:
Cu lnh :
double (*g)(int, double),(*mg[30])(double, float);
khai bo :

Chng 7: Con tr
91
g l con tr hm kiu double c cc i kiu int v double
mg l mng con tr hm kiu double c cc i kiu double v float ( c 30
phn t )

7.6.2. Tc dng ca con tr hm :
Con tr hm dng cha a ch ca hm. Mun vy ta thc hin php gn
tn hm cho con tr hm. php gn c ngha th kiu hm v kiu con tr phi
tng thch. Sau php gn, ta c th dng tn con tr hm thay cho tn hm.

V d 1:
#include "stdio.h"
double fmax(double x, double y ) /* Tnh max x,y */
{
return(x>y ? x:y);
}
double (*pf)(double,double)=fmax; /*Khai bo v gn tn hm cho con tr hm */
main() /* S dng con tr hm*/
{
printf("\n max=%f",pf(5.0,9.6));
}

V d 2:
#include "stdio.h"
double fmax(double x, double y ) /* Tnh max x,y */
{
return(x>y ? x:y);
}
double (*pf)(double,double); /* Khai bo con tr hm*/

main() /* S dng con tr hm*/
{
Chng 7: Con tr
92
pf=fmax;
printf("\n max=%f",pf(5.0,9.6));

}

7.6.3. i ca con tr hm :
C cho php thit k cc hm m tham s thc trong li gi ti n li l tn ca
mt hm khc. Khi tham s hnh thc tng ng phi l mt con tr hm.

Cch dng con tr hm trong thn hm :
Nu i c khai bo :

double (*f)(double, int);

th trong thn hm ta c th dng cc cch vit sau xc nh gi tr ca hm ( do
con tr f tr ti ) :
f(x,m) hoc (f)(x,m) hoc (*f)(x,m)
y x l bin kiu double cn m l bin kiu int.

V d :
Dng mng con tr lp bng gi tr cho cc hm : x*x, sin(x), cos(x),
exp(x) v sqrt(x). Bin x chay t 1.0 n 10.0 theo bc 0.5
#include "stdio.h"
#include "math.h"
double bp(double x) /* Hm tnh x*x */
{
return x*x;
}

main()
{
Chng 7: Con tr
93
int i,j;
double x=1.0;
typedef double (*ham)(double);
ham f[6]; /* Khai bao mng con tr hm*/
/* C th khai bo nh sau double (*f[6](double)*/
f[1]=bp; f[2]=sin; f[3]=cos; f[4]=exp; f[5]=sqrt;
/* Gn tn hm cho cc phn t mng con tr hm */
while (x<=10.0) /* Lp bng gi tr */
{
printf("\n");
for (j=1;j<=5;++j)
printf("%10.2f ",f[j](x));
x+=0.5;
}
}

You might also like