Professional Documents
Culture Documents
KhoaCngnghthngtin
BmnTinhccs
NHPMNLPTRNH
ngBnhPhng
dbphuong@fit.hcmuns.edu.vn
CONTR(NNGCAO)
VC
&
BB
Nidung
Con tr cp 2
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
}
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));
}
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
// 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
NMLTContrnngcao
11
VC
&
BB
Hngtipcn1
aCxD
10 11
0
1
2
i(d,c)?
d=i/C
c=i%C
NMLTContrnngcao
12
VC
&
BB
Hngtipcn1
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
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
V d
int (*ptr)[4];
NMLTContrnngcao
17
VC
&
BB
Hngtipcn2
VC
&
BB
Hngtipcn2
19
VC
&
Hngtipcn2
BB
NMLTContrnngcao
20
VC
&
Hngtipcn2
BB
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
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
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
V d
int (*pt1)(int, int);
// 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
// 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
NMLTContrnngcao
29
VC
&
BB
Contrhm
// Chnh quy
// Ngn gn
NMLTContrnngcao
30
VC
&
BB
Contrhm
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
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])(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);
NMLTContrnngcao
35
VC
&
BB
Bitplthuyt
36
VC
&
BB
Bitplthuyt
37
VC
&
BB
Bitplthuyt
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
NMLTContrnngcao
40
VC
&
BB
Bitplthuyt
NMLTContrnngcao
41
VC
&
BB
Bitpthchnh
42
VC
&
BB
Bitpthchnh
NMLTContrnngcao
43
VC
&
BB
Bitpthchnh
44
NMLTContrnngcao