You are on page 1of 44

TrngihcKhoahcTnhin

KhoaCngnghthngtin
BmnTinhccs

NHPMNLPTRNH

ngBnhPhng

dbphuong@fit.hcmuns.edu.vn

CONTR(NNGCAO)

VC

&
BB

Nidung

Con tr cp 2

Con tr v mng nhiu chiu

Mng con tr

Con tr hm

NMLTContrnngcao

VC

&
BB

Contrcp2(contrncontr)

t vn
void CapPhat(int *p, int n)
{
p = (int *)malloc(n * sizeof(int));
}
void main()
{
int *a = NULL;
CapPhat(a, 2);
// a vn = NULL
}

Lm sao thay i gi tr ca con tr (khng


phi gi tr m n tr n) sau khi gi
3
NMLTContrnngcao

VC

&

Contrcp2

BB

int*p

intn

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

22
N 00
U 00
L 00
L 02 00 00 00

CapPhat

int*p

NULL

intn
2

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

N U L L

int*a=NULL

NMLTContrnngcao

VC

&
BB

Contrcp2

Gii php
S dng tham chiu int *&p (trong C++)
void CapPhat(int *&p, int n)
{
p = (int *)malloc(n * sizeof(int));
}

Khng thay i trc tip tham s m tr v


int* CapPhat(int n)
{
int *p = (int *)malloc(n * sizeof(int));
return p;
}
NMLTContrnngcao

VC

&
BB

Contrcp2

Gii php
S dng con tr p tr n con tr a ny. Hm
s thay i gi tr ca con tr gin tip thng
qua con tr p.
void CapPhat(int **p, int n)
{
*p = (int *)malloc(n * sizeof(int));
}
void main()
{
int *a = NULL;
CapPhat(&a, 4);
}

NMLTContrnngcao

VC

&

Contrcp2

BB

int**p

intn

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

0B 00 00 00 02 00 00 00

CapPhat int**p
0B

intn
2

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

22
N 00
U 00
L 00
L

int*a=NULL

NMLTContrnngcao

VC

&
BB

Contrcp2

Lu
int x = 12;
int *ptr = &x;
int k = &x; ptr = k;

// OK
// Li

int **ptr_to_ptr = &ptr;


int **ptr_to_ptr = &x;

// OK
// Li

**ptr_to_ptr = 12;
*ptr_to_ptr = 12;

// OK
// Li

printf(%d, ptr_to_ptr);
printf(%d, *ptr_to_ptr);
printf(%d, **ptr_to_ptr);

// a ch ptr
// Gi tr ptr
// Gi tr x
NMLTContrnngcao

VC

&
BB

Contrvmng2chiu
int a[3][4];
0

10 11

0
1

int

0
1
2

int[4]
NMLTContrnngcao

VC

&
BB

Contrvmng2chiu

Hng tip cn 1
Cc phn t to thnh mng 1 chiu
S dng con tr int * duyt mng 1 chiu
int*p=(int*)a
+1
0

10 11

int a[3][4]
NMLTContrnngcao

10

VC

&

Hngtipcn1

BB

Nhp / Xut theo ch s mng 1 chiu


#define D 3
#define C 4
void main()
{
int a[D][C], i;
int *p = (int *)a;
for (i = 0; i < D*C; i++)
{
printf(Nhap phan tu thu %d: , i);
scanf(%d, p + i);
}
for (i = 0; i < D*C; i++)
printf(%d , *(p + i));
}

NMLTContrnngcao

11

VC

&
BB

Hngtipcn1

Lin h gia ch s mng 1 chiu v ch s


mng 2 chiu
(d,c)i?
i=d*C+c
0

aCxD

10 11

0
1
2

i(d,c)?
d=i/C
c=i%C

NMLTContrnngcao

12

VC

&
BB

Hngtipcn1

Nhp / Xut theo ch s mng 2 chiu


int a[D][C], i, d, c;
int *p = (int *)a;
for (i = 0; i < D*C; i++)
{
printf(Nhap a[%d][%d]: , i / C, i % C);
scanf(%d, p + i);
}
for (d = 0; d < D; d++)
{
for (c = 0; c < C; c++)
printf(%d , *(p + d * C + c));// *p++
printf(\n;
}
NMLTContrnngcao

13

VC

&
BB

Contrvmng2chiu

Hng tip cn 2
Mng 1 chiu, mi phn t l mng 1 chiu
a cha a[0], a[1], a = &a[0]
a[0] cha a[0][0], a[0][1], a[0] = &a[0][0]
a
+1
0

int a[3][4]

a[0]

+1
NMLTContrnngcao

14

VC

&
BB

Hngtipcn2

Kch thc ca mng


void main()
{
int a[3][4];
printf(KT ca a = %d, sizeof(a));
printf(KT ca a[0] = %d, sizeof(a[0]));
printf(KT ca a[0][0] = %d, sizeof(a[0][0]));
}
0
1
2
a
0

a[0]
a[0][0]

NMLTContrnngcao

15

VC

&

Hngtipcn2

BB

Nhn xt
a l con tr n a[0], a[0] l con tr n a[0][0]
a l con tr cp 2.
C th truy xut a[0][0] bng 3 cch:
void main()
{
int a[3][4];
a[0][0] = 1;
*a[0] = 1;
**a = 1;
a[1][0] = 1; *a[1] = 1; **(a+1) = 1;
a[1][2] = 1; *(a[1]+2) = 1; *(*(a+1)+2) = 1;
}

NMLTContrnngcao

16

VC

&
BB

Hngtipcn2

Truyn mng cho hm


Truyn a ch phn t u tin cho hm.
Khai bo con tr ri gn a ch mng cho con
tr ny n tr n mng.
Con tr ny phi cng kiu vi bin mng, tc
l con tr n vng nh n phn t (mng)
C php
<kiu d liu> (*<tn con tr>)[<s phn t>];

V d
int (*ptr)[4];
NMLTContrnngcao

17

VC

&
BB

Hngtipcn2

Truyn mng cho hm


void Xuat_1_Mang_C1(int (*ptr)[4]) // ptr[][4]
{
int *p = (int *)ptr;
for (int i = 0; i < 4; i++)
printf(%d , *p++);
}
void main()
{
int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
int (*ptr)[4];
ptr = a;
for (int i = 0; i < 3; i++)
Xuat_1_Mang_C1(ptr++); // hoc ptr + i
Xuat_1_Mang_C1(a++);
// sai => a + i
18
}
NMLTContrnngcao

VC

&
BB

Hngtipcn2

Truyn mng cho hm


void Xuat_1_Mang_C2(int *ptr, int n)
// ptr[]
{
for (int i = 0; i < n; i++)
printf(%d , *ptr++);
}
void main()
{
int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
int (*ptr)[4];
ptr = a;
for (int i = 0; i < 3; i++)
Xuat_1_Mang_C2((int *)ptr++);
Xuat_1_Mang_C2((int *)(a + i));// a++ sai
}
NMLTContrnngcao

19

VC

&

Hngtipcn2

BB

Truyn mng cho hm


void Xuat_n_Mang_C1(int (*ptr)[4], int n)
{
int *p = (int *)ptr;
for (int i = 0; i < n * 4; i++)
printf(%d , *p++);
}
void main()
{
int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
int (*ptr)[4];
ptr = a;
Xuat_n_Mang_1(ptr, 3);
Xuat_n_Mang_1(a, 3);
}

NMLTContrnngcao

20

VC

&

Hngtipcn2

BB

Truyn mng cho hm


void Xuat_n_Mang_C2(int (*ptr)[4], int n)
{
int *p;
for (int i = 0; i < n; i++)
{
p = (int *)ptr++;
for (int i = 0; i < 4; i++)
printf(%d , *p++);
printf(\n);
}
}
NMLTContrnngcao

21

VC

&
BB

Mngcontr

t vn
S dng cu trc d liu no lu tr thng
tin sau?
0

0
1
2

1 5 6
2 9 1 2 1 7 0 6
0 2

Gii php?
Cch 1: Mng 2 chiu 3x8 (tn b nh)
NMLTContrnngcao

22

VC

&

Mngcontr

BB

Cch 2: Mng 1 chiu cc con tr


18 19 1A 1B 1C 1D 1E 1F

1 5 6

28 29 2A 2B 2C 2D 2E 2F

2 9 1 2 1 7 0 6

3A 3B 3C

0 2

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

19 00 00 00 28 00 00 00 3A 00 00 00
array

NMLTContrnngcao

23

VC

&

Mngcontr

BB

V d
void print_strings(char *p[], int n)
{
for (int i = 0; i<n; i++)
printf(%s , p[i]);
}
void main()
{
char *message[4] = {Tin, Hoc, Co, So};
print_strings(message, 4);
}
NMLTContrnngcao

24

VC

&
BB

Contrhm

Khi nim
Hm cng uc lu tr trong b nh, tc l
cng c a ch.
Con tr hm l con tr tr n vng nh cha
hm v c th gi hm thng qua con tr .

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

11 00 00 00
p

intCong(int,int)

NMLTContrnngcao

25

VC

&
BB

Contrhm

Khai bo tng minh


<kiu tr v> (* <tn bin con tr>)(ds tham s);

V d
// Con tr n hm nhn i s int, tr v int
int (*ptof1)(int x);
// Con tr n hm nhn 2 i s double, khng tr
v
void (*ptof2)(double x, double y);
// Con tr n hm nhn i s mng, tr v char
char (*ptof3)(char *p[]);
// Con tr n khng nhn i s v khng tr v
26
NMLTContrnngcao
void (*ptof4)();

VC

&
BB

Contrhm

Khai bo khng tng minh (thng qua kiu)


typedef <kiu tr v> (* <tn kiu>)(ds tham s);
<tn kiu> <tn bin con tr>;

V d
int (*pt1)(int, int);

// Tng minh

typedef int (*PhepToan)(int, int);


PhepToan pt2, pt3;

// Khng tng minh

NMLTContrnngcao

27

VC

&
BB

Contrhm

Gn gi tr cho con tr hm
<bin con tr hm> = <tn hm>;
<bin con tr hm> = &<tn hm>;

Hm c gn phi cng dng (vo, ra)


V d
int Cong(int x, int y);
int Tru(int x, int y);
int (*tinhtoan)(int x, int y);
tinhtoan = Cong;
tinhtoan = &Tru;
tinhtoan = NULL;

// Hm
// Hm
// Con tr hm

// Dng ngn gn
// Dng s dng a ch
// Khng tr n u c
NMLTContrnngcao

28

VC

&

Contrhm

BB

So snh con tr hm
if
{

(tinhtoan != NULL)
if (tinhtoan == &Cong)
printf(Con tr n hm Cong.);
else
if (tinhtoan == &Tru)
printf(Con tr n hm Tru.);
else
printf(Con tr n hm khc.);

}
else

printf(Con tr cha c khi to!);

NMLTContrnngcao

29

VC

&
BB

Contrhm

Gi hm thng qua con tr hm


S dng ton t ly ni dung * (chnh quy)
nhng trng hp ny c th b
int Cong(int x, int y);
int Tru(int x, int y);
int (*tinhtoan)(int, int);
tinhtoan = Cong;
int kq1 = (*tinhtoan)(1, 2);
int kq2 = tinhtoan(1, 2);

// Chnh quy
// Ngn gn

NMLTContrnngcao

30

VC

&
BB

Contrhm

Truyn tham s l con tr hm


int Cong(int x, int y);
int Tru(int x, int y);
int TinhToan(int x, int y, int (*pheptoan)(int, int))
{
int kq = (*pheptoan)(x, y);
// Gi hm
return kq;
}
void main()
{
int (*pheptoan)(int, int) = &Cong;
int kq1 = TinhToan(1, 2, pheptoan);
int kq2 = TinhToan(1, 2, &Tru);
}
NMLTContrnngcao

31

VC

&
BB

Contrhm

Tr v con tr hm
int (*LayPhepToan(char code))(int, int)
{
if (code == +)
return &Cong;
return &Tru;
}
void main()
{
int (*pheptoan)(int, int) = NULL;
pheptoan = LayPhepToan(+);
int kq2 = pheptoan(1, 2, &Tru);
}
NMLTContrnngcao

32

VC

&
BB

Contrhm

Tr v con tr hm (khai bo kiu)


typedef (*PhepToan)(int, int);
PhepToan LayPhepToan(char code)
{
if (code == +)
return &Cong;
return &Tru;
}
void main()
{
PhepToan pheptoan = NULL;
pheptoan = LayPhepToan(+);
int kq2 = pheptoan(1, 2, &Tru);
}
NMLTContrnngcao

33

VC

&

Contrhm

BB

Mng con tr hm
typedef (*PhepToan)(int, int);
void main()
{
int (*array1[2])(int, int);
PhepToan array2[2];

// tng minh
// k tng minh

array1[0] = array2[1] = &Cong;


array1[1] = array2[0] = &Tru;
printf(%d\n,
printf(%d\n,
printf(%d\n,
printf(%d\n,

(*array1[0])(1, 2));
array1[1](1, 2));
array2[0](1, 2));
array2[1](1, 2));

}
NMLTContrnngcao

34

VC

&
BB

Contrhm

Lu
Khng c qun du () khi khai bo con tr
hm
int (*PhepToan)(int x, int y);
int *PhepToan(int x, int y);

C th b tn bin tham s trong khai bo con


tr hm
int (*PhepToan)(int x, int y);
int (*PhepToan)(int, int);

NMLTContrnngcao

35

VC

&
BB

Bitplthuyt

Cu 1: Ta c th khai bo v s dng bin con


tr n cp th my?
Cu 2: C s khc nhau gia con tr n mt
chui v con tr n mt mng k t khng?
Cu 3: Nu khng s dng cc kin thc nng
cao v con tr, ta c th gii quyt mt s bi
ton no khng?
Cu 4: Hy nn mt s ng dng ca con tr
hm.
NMLTContrnngcao

36

VC

&
BB

Bitplthuyt

Cu 5: Vit on lnh khai bo bin x kiu float,


khai bo v khi to con tr px n bin x v
khai bo v khi to con tr ppx n con tr px.
Cu 6: Ta mun gn 100 cho x thng qua con tr
ppx bng biu thc gn ppx = 100; c c
khng?
Cu 7: Gi s ta khai bo mng array 3 chiu int
array[2][3][4]. Cho bit cu trc ca mng ny
i vi trnh bin dch C.
Cu 8: Cho bit array[0][0] c ngha l g?
NMLTContrnngcao

37

VC

&
BB

Bitplthuyt

Cu 9: Xt xem biu thc so snh no sau y


ng
array[0][0] == & array[0][0][0];
array[0][1] == array[0][0][1];
array[0][1] == &array[0][1][0];
Cu 10: Vit nguyn mu ca mt hm nhn
mt mng con tr n kiu char lm i s, v
gi tr tr v c kiu void.
Cu 11: Theo cch vit ca cu 10, ta c th bit
c s phn t ca mng c truyn k?
NMLTContrnngcao

38

VC

&
BB

Bitplthuyt

Cu 12: Con tr n hm l g?
Cu 13: Vit khai bo con tr n mt hm m
hm c gi tr tr v kiu char, nhn i s l
mt mng con tr n kiu char.
Cu 14: Ta vit khai bo con tr cu 12 nh
vy c ng khng? char *ptr(char *x[]);
Cu 15: Cho bit ngha ca cc khai bo sau:
int *var1;
int var2;
int **var3;
NMLTContrnngcao

39

VC

&
BB

Bitplthuyt

Cu 16: Cho bit ngha ca cc khai bo sau:


int a[3][12];
int (*b)[12];
int *c[12];
Cu 17: Cho bit ngha ca cc khai bo sau:
char *z[10];
char *y(int field);
char (*x)(int field);

NMLTContrnngcao

40

VC

&
BB

Bitplthuyt

Cu 18: Vit khai bo con tr func n mt hm


nhn i s l mt s nguyn v tr v gi tr
kiu float.
Cu 19: Vit khai bo mt mng con tr n
hm. Cc hm nhn mt chui k t lm tham s
v tr v gi tr kiu nguyn. Ta c th s dng
mng ny lm g?
Cu 20: Vit cu lnh khai bo mt mng 10 con
tr n kiu char.

NMLTContrnngcao

41

VC

&
BB

Bitpthchnh

Cu 21: Tm li sai trong on lnh sau


int x[3][12];
int *ptr[12];
ptr = x;
Cu 22: Vit chng trnh khai bo mng hai
chiu c 12x12 phn t kiu char. Gn k t X
cho mi phn t ca mng ny. S dng con tr
n mng in gi tr cc phn t mng ln
mn hnh dng li.
NMLTContrnngcao

42

VC

&
BB

Bitpthchnh

Cu 23: Vit chng trnh khai bo mng 10 con


tr n kiu float, nhn 10 s thc t bn phm,
sp xp li v in ra mn hnh dy s sp xp.
Cu 24: Sa li bi tp 22 ngi s dng c
th la chn cch sp xp theo th t tng hay
gim dn.

NMLTContrnngcao

43

VC

&
BB

Bitpthchnh

Cu 25: Chng trnh cho php ngi dng nhp


cc dng vn bn t bn phm n khi nhp mt
dng trng. Chng trnh s sp xp cc dng
theo th t alphabet ri hin th chng ra mn
hnh.
Cu 26: S dng con tr hm vit cc hm
sp xp sau
Tng dn
Gim dn
Dng gim ri m tng, cui cng l s 0

44
NMLTContrnngcao

You might also like