KTLT C13 ConTroCoBan - PPT (By Bsquochoai - Ga)

You might also like

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)

1
&
VC
BB
Ni dung

1 Khi nim v cch s dng

2 Cc cch truyn i s cho hm

3 Con tr v mng mt chiu

4 Con tr v cu trc

D liu kiu con tr (c bn)


2
&
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)
3
&
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)


4
&
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 0B 00 00 00

a pa D liu kiu con tr (c bn)


5
&
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)
6
&
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)
7
&
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 n;
int *p1 = &n;
int *p2; // unreferenced local variable
int *p3 = NULL;

NULL

D liu kiu con tr (c bn)


8
&
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)
9
&
VC
BB
S dng con tr

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 = &a;
printf(%d\n, pa); // Gi tr bin pa
printf(%d\n, *pa); // Gi tr vng nh pa tr n
printf(%d\n, &pa); // a ch bin pa

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

05 00 00 00 0B 00 00 00

10
a pa D liu kiu con tr (c bn)
&
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

int t = x;
hoanvi int x int y 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

int t = *x;
hoanvi int *x int *y *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++)

int t = x;
hoanvi int &x int &y 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
&
VC
BB
Con tr v mng mt chiu

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
&
VC
BB
Con tr v mng mt chiu

Con tr n mng mt chiu


int array[3], *parray;

parray = array; // Cch 1


parray = &array[0]; // 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

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 n

int a[] 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++)); // OK
}
void main()
{
int a[10], n = 10;

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


printf(%d, *(a++)); // 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
&
VC
BB
Bi tp

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