Professional Documents
Culture Documents
NMLT C13 ConTroNangCao
NMLT C13 ConTroNangCao
NHP MN LP TRNH
ng Bnh Phng
dbphuong@fit.hcmuns.edu.vn
V & C B B
Ni dung
1 2 3 4
Con tr cp 2
Mng con tr
Con tr hm
V & C B B
v t vn v void CapPhat(int *p, int n) { v p = (int *)malloc(n * sizeof(int)); } v v void main() { int *a = NULL; v CapPhat(a, 2); v // a vn = NULL v} Lm sao thay i gi tr ca con tr (khng phi gi tr m n tr n) sau khi gi hm?
NMLT - Con tr nng cao
V & C B B
i Con tr cp i 2 n n t t * 1 1 1 1 1 n 1 1 2 1 p A B C D E F 0 8 9 2 0 0 0 0 0 0 0 N U L L 2 0 0 0 2 0 0 0
2 1
2 2
2 3
2 4
2 5
CapP hat
0 A
i n 0 0 B C D E t N U L L * a =
int N *p U L 0 L 0 0
F
int n 2
1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7
V & C B B
Con tr cp 2
v 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; }
NMLT - Con tr nng cao
V & C B B
Con tr cp 2
v 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); }
NMLT - Con tr nng cao
V & C B B
i n Con tr cp i 2 t n * t 1 * 1 1 1 n 1 1 2 1 1 8 p A B C D E F 0 9 0 0 0 0 0 0 0 0 B 0 0 0 2 0 0 0
2 1
2 2
2 3
2 4
2 5
CapP hat
0 A
i n 0 0 0 0 B C D E t 2 0 0 0 N U L L * 0 0 0 2 a =
int **p 0 B
int n 2
0 F 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7
V & C B B
Con tr cp 2
v Lu
int x = 12; int *ptr = &x; // OK int k = &x; ptr = k; // Li int **ptr_to_ptr = &ptr; int **ptr_to_ptr = &x; **ptr_to_ptr = 12; *ptr_to_ptr = 12; // OK // Li // OK // Li
V & C B B
0 1 2
i n t
0 1 2 3 1 2
0 1 2
V & C B B
i v Hng tip cn 1 n t Cc phn t to thnh mng 1 chiu S * dng con tr int * duyt mng 1 p chiu = (i n t * 0 ) int a[3][4] a + 1
1 2 3 4 5 6 7 8 9 1 0 1 1
10
V & C B B
Hng tip cn 1
11
V & C B B
Hng tip cn 1
aCxD
0 1 2
6 7 d i = i ( / d, C c) c ? = i %
1 0
1 1
12
V & C B B
Hng tip cn 1
13
V & C B B
int a[3][4]
a + [ 1 0 ]
14
V & C B B
Hng tip cn 2
a
0 1 2 3
a[0] a[0][0]
15
V & C B B
Hng tip cn 2
v 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; }
NMLT - Con tr nng cao
16
V & C B B
Hng tip cn 2
v 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) v C php <kiu d liu> (*<tn con tr>)[<s phn t>]; v v V d
int (*ptr)[4];
NMLT - Con tr nng cao
17
V & C B B
Hng tip cn 2
18
V & C B B
Hng tip cn 2
19
V & C B B
Hng tip cn 2
20
V & C B B
Hng tip cn 2
V & C B B
Mng con tr
v 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 v Gii php? Cch 1: Mng 2 chiu 3x8 (tn b nh)
NMLT - Con tr nng cao
22
V & C B B
Mng con tr
Cch 2: Mng 1 chiu cc con tr 1 1 1 1 1 1 1 1
1 5 6
8 9 A B C D 2 8 E F 2 9 2 A
2 B
2 9 1 2 1 7 0 6 0 2
1 5 1 6 3 A 3 B
2 C
2 D
2 E
2 F
3 C 1 7
0 A
0 B
0 C
0 D
0 E
0 F
1 0
1 1
1 2
1 3
1 4
23
V & C B B
Mng con tr
v 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); }
24
V & C B B
Con tr hm
v 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 . i
0 A 0 B 0 C 0 D 0 E 0 F 1 0
1 0 0 0 1 0 0 0 p
n t 1 C 1 o n g (i
1 2
1 3
1 4
1 5
1 6
1 7
25
V & C B B
Con tr hm
// 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 void (*ptof4)();
NMLT - Con tr nng cao
26
V & C B B
Con tr hm
v Khai bo khng tng minh (thng qua kiu) v typedef <kiu tr v> (* <tn kiu>)(ds tham s); <tn kiu> <tn bin con tr>; v v V d
int (*pt1)(int, int); // Tng minh typedef int (*PhepToan)(int, int); PhepToan pt2, pt3; // Khng tng minh
27
V & C B B
Con tr hm
v Gn gi tr cho con tr hm v <bin con tr hm> = <tn hm>; v <bin con tr hm> = &<tn hm>; Hm c gn phi cng dng (vo, ra) v V d
int Cong(int x, int y); // Hm int Tru(int x, int y); // Hm int (*tinhtoan)(int x, int y); // Con tr hm tinhtoan = Cong; tinhtoan = &Tru; tinhtoan = NULL; // Dng ngn gn // Dng s dng a ch // Khng tr n u c
NMLT - Con tr nng cao
28
V & C B B
Con tr hm
v 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.); printf(Con tr cha c khi to!);
} else
29
V & C B B
Con tr hm
v 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); // Chnh quy int kq2 = tinhtoan(1, 2); // Ngn gn
30
V & C B B
Con tr hm
31
V & C B B
Con tr hm
v 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); }
NMLT - Con tr nng cao
32
V & C B B
Con tr hm
33
V & C B B
Con tr hm
v Mng con tr hm
typedef (*PhepToan)(int, int); void main() { int (*array1[2])(int, int); // tng minh PhepToan array2[2]; // 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, }
NMLT - Con tr nng cao
V & C B B
Con tr hm
35
V & C B B
Bi tp l thuyt
v Cu 1: Ta c th khai bo v s dng bin con tr n cp th my? v Cu 2: C s khc nhau gia con tr n mt chui v con tr n mt mng k t khng? v 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? v Cu 4: Hy nn mt s ng dng ca con tr hm.
36
V & C B B
Bi tp l thuyt
v 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. v Cu 6: Ta mun gn 100 cho x thng qua con tr ppx bng biu thc gn ppx = 100; c c khng? v 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. v Cu 8: Cho bit array[0][0] c ngha l g?
NMLT - Con tr nng cao
37
V & C B B
Bi tp l thuyt
v 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]; v 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. v Cu 11: Theo cch vit ca cu 10, ta c th bit c s phn t ca mng c truyn k?
NMLT - Con tr nng cao
38
V & C B B
Bi tp l thuyt
v Cu 12: Con tr n hm l g? v 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. v Cu 14: Ta vit khai bo con tr cu 12 nh vy c ng khng? char *ptr(char *x[]); v Cu 15: Cho bit ngha ca cc khai bo sau: int *var1; int var2; int **var3;
NMLT - Con tr nng cao
39
V & C B B
Bi tp l thuyt
v Cu 16: Cho bit ngha ca cc khai bo sau: int a[3][12]; int (*b)[12]; int *c[12]; v Cu 17: Cho bit ngha ca cc khai bo sau: char *z[10]; char *y(int field); char (*x)(int field);
40
V & C B B
Bi tp l thuyt
v 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. v 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? v Cu 20: Vit cu lnh khai bo mt mng 10 con tr n kiu char.
41
V & C B B
Bi tp thc hnh
v Cu 21: Tm li sai trong on lnh sau int x[3][12]; int *ptr[12]; ptr = x; v 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.
42
V & C B B
Bi tp thc hnh
v 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. v Cu 24: Sa li bi tp 22 ngi s dng c th la chn cch sp xp theo th t tng hay gim dn.
43
V & C B B
Bi tp thc hnh
v 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. v 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
NMLT - Con tr nng cao