You are on page 1of 44

V & C B B

Trng i hc Khoa hc T nhin Khoa Cng ngh thng tin B mn Tin hc c s

NHP MN LP TRNH
ng Bnh Phng
dbphuong@fit.hcmuns.edu.vn

CON TR (NNG CAO)

V & C B B

Ni dung

1 2 3 4

Con tr cp 2

Con tr v mng nhiu chiu

Mng con tr

Con tr hm

NMLT - Con tr nng cao

V & C B B

Con tr cp 2 (con tr n con tr)

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

NMLT - Con tr nng cao

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

NMLT - Con tr nng cao

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

printf(%d, ptr_to_ptr); // a ch ptr printf(%d, *ptr_to_ptr); // Gi tr ptr printf(%d, **ptr_to_ptr); // Gi tr x


8

NMLT - Con tr nng cao

V & C B B

Con tr v mng 2 chiu


int a[3][4];
0 1 2 3 4 5 6 7 8 9 1 0 1 1

0 1 2

i n t
0 1 2 3 1 2

0 1 2

i n t [ NMLT - Con tr nng cao 4

V & C B B

Con tr v mng 2 chiu

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

NMLT - Con tr nng cao

10

V & C B B

Hng tip cn 1

v 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));
NMLT - Con tr nng cao

11

V & C B B

Hng tip cn 1

v Lin h gia ch s mng 1 chiu v ch s mng 2 chiu (


d, i c) = d i * ? C 1+ 2 c

aCxD

0 1 2

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

1 0

1 1

NMLT - Con tr nng cao

12

V & C B B

Hng tip cn 1

v 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; }
NMLT - Con tr nng cao

13

V & C B B

Con tr v mng 2 chiu

v 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]

a + [ 1 0 ]

NMLT - Con tr nng cao

14

V & C B B

Hng tip cn 2

v 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 1 2 3

a[0] a[0][0]
15

NMLT - Con tr nng cao

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

v 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 }
NMLT - Con tr nng cao

18

V & C B B

Hng tip cn 2

v 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 }
NMLT - Con tr nng cao

19

V & C B B

Hng tip cn 2

v 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);
NMLT - Con tr nng cao

20

V & C B B

Hng tip cn 2

v 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); } }
21

NMLT - Con tr nng cao

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

1 0 0 0 2 0 0 0 3 0 0 0 a 0 0 0 8 0 0 0 A 0 0 0 9 r r NMLT - Con tr nng cao

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); }

NMLT - Con tr nng cao

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

NMLT - Con tr nng cao

V & C B B

Con tr hm

v Khai bo tng minh v <kiu tr v> (* <tn bin v V d

con tr>)(ds tham s);

// 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

NMLT - Con tr nng cao

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

NMLT - Con tr nng cao

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

NMLT - Con tr nng cao

30

V & C B B

Con tr hm

v 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); }
NMLT - Con tr nng cao

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

v 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); }
NMLT - Con tr nng cao

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

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


34

V & C B B

Con tr hm

v 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);

NMLT - Con tr nng cao

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.

NMLT - Con tr nng cao

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);

NMLT - Con tr nng cao

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.

NMLT - Con tr nng cao

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

NMLT - Con tr nng cao

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.

NMLT - Con tr nng cao

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

You might also like