Professional Documents
Culture Documents
KTLT C14 ConTroNangCao - PPT (By Bsquochoai - Ga)
KTLT C14 ConTroNangCao - PPT (By Bsquochoai - Ga)
KTLT C14 ConTroNangCao - PPT (By Bsquochoai - Ga)
K THUT LP TRNH
ThS. ng Bnh Phng
dbphuong@fit.hcmus.edu.vn
1
&
VC
BB
Ni dung
1 Con tr cp 2
3 Mng con tr
4 Con tr hm
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 hm?
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
N U L L
Gii php
S dng tham chiu int *&p (trong C++)
void CapPhat(int *&p, int n)
{
p = (int *)malloc(n * sizeof(int));
}
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);
}
D liu kiu con tr (nng cao)
6
&
VC
BB
Con tr cp 2
int **p int n
18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25
0B 00 00 00 02 00 00 00
22
N 00
U 00
L 00
L
Lu
int x = 12;
int *ptr = &x; // OK
int k = &x; ptr = k; // Li
**ptr_to_ptr = 12; // OK
*ptr_to_ptr = 12; // Li
int a[3][4];
0 1 2 3 4 5 6 7 8 9 10 11
a 0
2 int
0 1 2 3 1 2
a 0
2 int[4]
D liu kiu con tr (nng cao)
9
&
VC
BB
Con tr v mng 2 chiu
Hng tip cn 1
Cc phn t to thnh mng 1 chiu
S dng con tr int * duyt mng 1 chiu
+1
0 1 2 3 4 5 6 7 8 9 10 11
int a[3][4]
i = d*C + c
0 1 2 3 4 5 6 7 8 9 10 11
aCxD 0
1
i (d, c) ?
2
d=i/C
c=i%C
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 1 2
int a[3][4]
+1
a[0]
D liu kiu con tr (nng cao)
14
&
VC
BB
Hng tip cn 2
0 1 2 3
a[0]
a[0][0] 15
D liu kiu con tr (nng cao)
&
VC
BB
Hng tip cn 2
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;
V d
int (*ptr)[4];
D liu kiu con tr (nng cao)
17
&
VC
BB
Hng tip cn 2
Xuat_n_Mang_1(ptr, 3);
Xuat_n_Mang_1(a, 3);
} D liu kiu con tr (nng cao)
20
&
VC
BB
Hng tip cn 2
printf(\n);
}
}
t vn
S dng cu trc d liu no lu tr thng
tin sau?
0 1 2 3 4 5 6 7
0 1 5 6
1 2 9 1 2 1 7 0 6
2 0 2
Gii php?
Cch 1: Mng 2 chiu 3x8 (tn b nh)
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
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);
}
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
V d
// Con tr n hm nhn i s int, tr v int
int (*ptof1)(int x);
V d
int (*pt1)(int, int); // Tng minh
Gn gi tr cho con tr hm
<bin con tr hm> = <tn hm>;
<bin con tr hm> = &<tn hm>;
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!);
tinhtoan = Cong;
int kq1 = (*tinhtoan)(1, 2); // Chnh quy
int kq2 = tinhtoan(1, 2); // Ngn gn
void main()
{
int (*pheptoan)(int, int) = &Cong;
int kq1 = TinhToan(1, 2, pheptoan);
int kq2 = TinhToan(1, 2, &Tru);
}
D liu kiu con tr (nng cao)
31
&
VC
BB
Con tr hm
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);
}
void main()
{
PhepToan pheptoan = NULL;
pheptoan = LayPhepToan(+);
int kq2 = pheptoan(1, 2, &Tru);
}
D liu kiu con tr (nng cao)
33
&
VC
BB
Con tr hm
Mng con tr hm
typedef (*PhepToan)(int, int);
void main()
{
int (*array1[2])(int, int); // tng minh
PhepToan array2[2]; // k tng minh
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);
b. int (*b)[12];
c. int *c[12];