Download as pdf or txt
Download as pdf or txt
You are on page 1of 40

B mn Cng ngh phn mm

Khoa Cng ngh thng tin


Trng i hc Khoa hc T nhin

K THUT LP TRNH

ThS. ng Bnh Phng


dbphuong@fit.hcmus.edu.vn

D LIU KIU CON TR


(C BN)

&
VC
BB

Ni dung

Khi nim v cch s dng

Cc cch truyn i s cho hm

Con tr v mng mt chiu

Con tr v cu trc

D liu kiu con tr (c bn)

&
VC
BB

Kin trc my tnh

B nh my tnh
B nh RAM cha rt nhiu nh, mi nh
c kch thc 1 byte.
RAM dng cha mt phn h iu hnh,
cc lnh chng trnh, cc d liu
Mi nh c a ch duy nht v a ch ny
c nh s t 0 tr i.
V d
RAM 512MB c nh a ch t 0 n 229 1
RAM 2GB c nh a ch t 0 n 231 1
D liu kiu con tr (c bn)

&
VC
BB

Khai bo bin trong C

Quy trnh x l ca trnh bin dch


Dnh ring mt vng nh vi a ch duy nht
lu bin .
Lin kt a ch nh vi tn bin.
Khi gi tn bin, n s truy xut t ng n
nh lin kt vi tn bin.
V d: int a = 0x1234;
// Gi s a ch 0x0B
0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17

34 12 00 00
a

D liu kiu con tr (c bn)

&
VC
BB

Khi nim con tr

Khi nim
a ch ca bin l mt con s.
Ta c th to bin khc lu a ch ca
bin ny Con tr.

0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17

34 12 00 00
a

0B 00 00 00
pa

D liu kiu con tr (c bn)

&
VC
BB

Khai bo con tr

Khai bo
Ging nh mi bin khc, bin con tr mun
s dng cng cn phi c khai bo
<kiu d liu> *<tn bin con tr>;

V d
char *ch1, *ch2;
int *p1, p2;

ch1 v ch2 l bin con tr, tr ti vng nh


kiu char (1 byte).
p1 l bin con tr, tr ti vng nh kiu int (4
bytes) cn p2 l bin kiu int bnh thng.
D liu kiu con tr (c bn)

&
VC
BB

Khai bo con tr

S dng t kha typedef


typedef <kiu d liu> *<tn kiu con tr>;
<tn kiu con tr> <tn bin con tr>;

V d

typedef int *pint;


int *p1;
pint p2, p3;

Lu khi khai bo kiu d liu mi


Gim bi ri khi mi tip xc vi con tr.
Nhng d nhm ln vi bin thng.
D liu kiu con tr (c bn)

&
VC
BB

Con tr NULL

Khi nim
Con tr NULL l con tr khng tr v u c.
Khc vi con tr cha c khi to.
int
int
int
int

n;
*p1 = &n;
*p2;
// unreferenced local variable
*p3 = NULL;

NULL
D liu kiu con tr (c bn)

&
VC
BB

Khi to kiu con tr

Khi to
Khi mi khai bo, bin con tr c t a
ch no (khng bit trc).
cha gi tr khng xc nh
tr n vng nh khng bit trc.
t a ch ca bin vo con tr (ton t &)
<tn bin con tr> = &<tn bin>;

V d
int a, b;
int *pa = &a, *pb;
pb = &b;
D liu kiu con tr (c bn)

&

S dng con tr

VC
BB

Truy xut n nh m con tr tr n


Con tr cha mt s nguyn ch a ch.
Vng nh m n tr n, s dng ton t *.
V d
int a = 5, *pa
printf(%d\n,
printf(%d\n,
printf(%d\n,

= &a;
pa); // Gi tr bin pa
*pa); // Gi tr vng nh pa tr n
&pa); // a ch bin pa

0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17

05 00 00 00
a

0B 00 00 00
pa

D liu kiu con tr (c bn)

10

&
VC
BB

Kch thc ca con tr

Kch thc ca con tr


char *p1;
int *p2;
float *p3;
double *p4;

Con tr ch lu a ch nn kch thc ca mi


con tr l nh nhau:
Mi trng MD-DOS (16 bit): 2 bytes (64KB)
Mi trng Windows (32 bit): 4 bytes (4GB)

D liu kiu con tr (c bn)

11

&
VC
BB

Cc cch truyn i s

Truyn gi tr (tham tr)


#include <stdio.h>
void hoanvi(int x, int y);
void main()
{
int a = 3; b = 6;
hoanvi(a, b);
printf(a = %d, b = %d, a, b);
}
void hoanvi(int x, int y)
{
int t = x; x = y; y = t;
}
D liu kiu con tr (c bn)

12

&
VC
BB

Truyn gi tr (tham tr)


int x

int y

18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25

05 00 00 00 06 00 00 00

hoanvi

int x

int y

int t = x;
x = y;
y = t;

0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17

05 00 00 00 06 00 00 00
int a = 3

int b = 6

D liu kiu con tr (c bn)

13

&
VC
BB

Cc cch truyn i s

Truyn a ch (con tr)


#include <stdio.h>
void hoanvi(int *x, int *y);
void main()
{
int a = 3; b = 6;
hoanvi(&a, &b);
printf(a = %d, b = %d, a, b);
}
void hoanvi(int *x, int *y)
{
int t = *x; *x = *y; *y = t;
}
D liu kiu con tr (c bn)

14

&
VC
BB

Truyn a ch (con tr)


int *x

int *y

18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25

0B 00 00 00 0F 00 00 00

hoanvi

int *x

int *y

int t = *x;
*x = *y;
*y = t;

0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17

05 00 00 00 06 00 00 00
int a = 3

int b = 6

D liu kiu con tr (c bn)

15

&
VC
BB

Cc cch truyn i s

Truyn tham chiu (C++)


#include <stdio.h>
void hoanvi(int &x, int &y);
void main()
{
int a = 3; b = 6;
hoanvi(a, b);
printf(a = %d, b = %d, a, b);
}
void hoanvi(int &x, int &y)
{
int t = x; x = y; y = t;
}
D liu kiu con tr (c bn)

16

&
VC
BB

Truyn tham chiu (C++)

hoanvi

int &x

int &y

int t = x;
x = y;
y = t;

0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17

05 00 00 00 06 00 00 00
int a = 3

int b = 6

D liu kiu con tr (c bn)

17

&
VC
BB

Mt s lu

Mt s lu
Con tr l khi nim quan trng v kh nht
trong C. Mc thnh tho C c nh gi
qua mc s dng con tr.
Nm r quy tc sau, v d int a, *pa = &a;
*pa v a u ch ni dung ca bin a.
pa v &a u ch a ch ca bin a.

Khng nn s dng con tr khi cha c


khi to. Kt qu s khng lng trc c.
int *pa; *pa = 1904; // !!!
D liu kiu con tr (c bn)

18

&

Con tr v mng mt chiu

VC
BB

Mng mt chiu
int array[3];

Tn mng array l mt hng con tr


khng th thay i gi tr ca hng ny.
Gi tr ca array l a ch phn t u tin
ca mng
array == &array[0]
0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17

array

D liu kiu con tr (c bn)

19

&

Con tr v mng mt chiu

VC
BB

Con tr n mng mt chiu


int array[3], *parray;
parray = array;
parray = &array[0];

// Cch 1
// Cch 2
18 19 1A 1B 1C 1D 1E 1F

0B 00 00 00

parray
0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17

array

D liu kiu con tr (c bn)

20

&
VC
BB

Php ton s hc trn con tr

Php cng (tng)


+ n + n * sizeof(<kiu d liu>)
C th s dng ton t gp += hoc ++
p = array

+2

+1
0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17

int array[3];

D liu kiu con tr (c bn)

21

&
VC
BB

Php ton s hc trn con tr

Php tr (gim)
n n * sizeof(<kiu d liu>)
C th s dng ton t gp = hoc
p = &array[2]

2
1

0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17

int array[3];

D liu kiu con tr (c bn)

22

&
VC
BB

Php ton s hc trn con tr

Php ton tnh khong cch gia 2 con tr


<kiu d liu> *p1, *p2;
p1 p2 cho ta khong cch (theo s phn t)
gia hai con tr (cng kiu)
p1 = array

p2 = &array[2]

p1 p2= (0B 13)/sizeof(int) = 2


p2 p1= (13 0B)/sizeof(int) = +2

0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17

int array[3];

D liu kiu con tr (c bn)

23

&
VC
BB

Php ton s hc trn con tr

Cc php ton khc


Php so snh: So snh a ch gia hai con
tr (th t nh)
== !=
>
>=
<
<=

Khng th thc hin cc php ton: * / %

D liu kiu con tr (c bn)

24

&
VC
BB

Con tr v mng mt chiu

Truy xut n phn t th n ca mng


int array[3], n = 2, *p = array;
array[n] == p[n] == *(p + n)
* ( p + 2 )

0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17

int array[3];

D liu kiu con tr (c bn)

25

&
VC
BB

Con tr v mng mt chiu

V d nhp mng
void main()
{
int a[10], n = 10, *pa;
pa = a;
// hoc pa = &a[0];
for (int i = 0; i<n; i++)
scanf(%d, &a[i]);
scanf(%d, &pa[i]);
scanf(%d, a + i);
scanf(%d, pa + i);
scanf(%d, a++);
scanf(%d, pa++);

}
&a[i] (a + i) (pa + i) &pa[i]
D liu kiu con tr (c bn)

26

&
VC
BB

Con tr v mng mt chiu

V d xut mng
void main()
{
int a[10], n = 10, *pa;
pa = a;
// hoc pa = &a[0];

for (int i = 0; i<n; i++)


printf(%d, a[i]);
printf(%d, pa[i]);
printf(%d, *(a + i));
printf(%d, *(pa + i));
printf(%d, *(a++));
printf(%d, *(pa++));
}
a[i] *(a + i) *(pa + i) pa[i]
D liu kiu con tr (c bn)

27

&
VC
BB

Truyn mng 1 chiu cho hm

Ch !
Mng mt chiu truyn cho hm l a ch ca
phn t u tin ch khng phi ton mng.
xut int a[3]
int a[]

int n

int *a

10 11 13 14 15 16 17 18 19 20 21 22 23 24

int array[3];

D liu kiu con tr (c bn)

28

&
VC
BB

i s mng truyn cho hm

V d
void xuat(int a[10], int n)
{
for (int i = 0; i<n; i++)
printf(%d, *(a++));
}
void main()
{
int a[10], n = 10;
for (int i = 0; i<n; i++)
printf(%d, *(a++));

// OK

// Li

}
i s mng truyn cho hm khng phi hng
con tr.
D liu kiu con tr (c bn)

29

&
VC
BB

Con tr v mng mt chiu

Lu
Khng thc hin cc php ton *, /, %.
Tng/gim con tr n n v c ngha l
tng/gim gi tr ca n n*sizeof(<kiu d
liu m n tr n>) (bytes)
Khng th tng/gim bin mng (con tr
hng). Hy gn mt con tr n a ch u
ca mng v tng/gim con tr .
i s mng mt chiu truyn cho hm l a
ch phn t u tin ca mng.
D liu kiu con tr (c bn)

30

&
VC
BB

Con tr v cu trc

Truy xut bng 2 cch


<tn bin con tr cu trc>-><tn thnh phn>
(*<tn bin con tr cu trc>).<tn thnh phn>

V d
typedef struct
{
int tu, mau;
} PHANSO;
PHANSO ps1, *ps2 = &ps1; // ps2 l con tr

ps1.tu = 1; ps1.mau = 2;
ps2->tu = 1; ps2->mau = 2;
(*ps2).tu = 1; (*ps2).mau = 2;
D liu kiu con tr (c bn)

31

&
VC
BB

Bi tp

Bi 1: Cho on chng trnh sau:


float pay;
float *ptr_pay;
pay=2313.54;
ptr_pay = &pay;
Hy cho bit gi tr ca:
a. pay
b. *ptr_pay
c. *pay
d. &pay

D liu kiu con tr (c bn)

32

&

Bi tp

VC
BB

Bi 2: Tm li
#include <stdio.h>
#include <conio.h>
void main()
{
int *x, y = 2;
*x = y;
*x += y++;
printf("%d %d", *x, y);
getch();

}
D liu kiu con tr (c bn)

33

&
VC
BB

Bi tp

Bi 3: Cho on chng trnh sau:


int *pint;
float f;
char c;
double *pd;
Hy chn pht biu sai c php:
a. f = *pint;
b. c = *pd;
c. *pint = *pd;
d. pd = f;

D liu kiu con tr (c bn)

34

&
VC
BB

Bi tp

Bi 4: Ton t no dng xc nh a ch ca
mt bin?

Bi 5: Ton t no dng xc nh gi tr ca
bin do con tr tr n?

Bi 6: Php ly gi tr gin tip l g?

D liu kiu con tr (c bn)

35

&
VC
BB

Bi tp

Bi 7: Cc phn t trong mng c sp xp


trong b nh nh th no?

Bi 8: Cho mng mt chiu data. Trnh by 2


cch ly a ch phn t u tin ca mng ny.

D liu kiu con tr (c bn)

36

&
VC
BB

Bi tp

Bi 9: Trnh by 6 loi php ton c th thc


hin trn con tr?
1.
2.
3.
4.
5.
6.

D liu kiu con tr (c bn)

37

&
VC
BB

Bi tp

Bi 10: Cho con tr p1 tr n phn t th 3


cn con tr p2 tr n phn t th 4 ca mng
int th p2 p1 = ?

Bi 11: Ging nh cu trn nhng i vi mng


float?

D liu kiu con tr (c bn)

38

&
VC
BB

Bi tp

Bi 12: Trnh by khai bo con tr pchar tr n


kiu char.

Bi 13: Cho bin cost kiu int. Khai bo v khi


to con tr pcost tr n bin ny.

Bi 14: Gn gi tr 100 cho bin cost s dng


hai cch trc tip v gin tip.
Trc tip:
Gin tip:
D liu kiu con tr (c bn)

39

&
VC
BB

Bi tp

Bi 15: In gi tr ca con tr v gi tr ca bin


m n tr ti.

Bi 16: S dng con tr lm li cc bi tp v


mng mt chiu.
Nhp/Xut mng
Tm phn t tha yu cu
Tnh tng/m cc phn t tha yu cu
Sp xp tng/gim
D liu kiu con tr (c bn)

40

You might also like