CON TRỎ NÂNG CAO

Embed Size (px)

Citation preview

TrngihcKhoahcTnhin KhoaCngnghthngtin BmnTinhccs

NHPMNLPTRNH

[email protected]

ngBnhPhng

CONTR(NNGCAO)

1

VC

& BB

Nidung

1 2 3 4

Con tr cp 2

Con tr v mng nhiu chiu

Mng con tr

Con tr hm

NMLTContrnngcao

2

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 3NMLTContrnngcao

VC

& BB

Contrcp2int*p intn18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25

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

CapPhat

int*p

intn 2 NMLTContrnngcao

NULL N U L L

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

int*a=NULL

4

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 vint* CapPhat(int n) { int *p = (int *)malloc(n * sizeof(int)); return p; }NMLTContrnngcao

5

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

6

VC

& BB

Contrcp2int**p intn18 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 22 00 00 00 N U L L

intn 2 NMLTContrnngcao

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

int*a=NULL

7

VC

& BB

Contrcp2

Lu int x = 12; int *ptr = &x; int k = &x; ptr = k; int **ptr_to_ptr = &ptr; int **ptr_to_ptr = &x; **ptr_to_ptr = 12; *ptr_to_ptr = 12; printf(%d, ptr_to_ptr); printf(%d, *ptr_to_ptr); printf(%d, **ptr_to_ptr); // OK // Li // OK // Li // OK // Li // a ch ptr // Gi tr ptr // Gi tr xNMLTContrnngcao

8

VC

& BB

Contrvmng2chiuint a[3][4];0 1 2 3 4 5 6 7 8 9 10 11 0 1 2

a

int0 1 2 3 1 2

a

0 1 2

int[4]NMLTContrnngcao

9

VC

& BB

Contrvmng2chiu

Hng tip cn 1 Cc phn t to thnh mng 1 chiu S dng con tr int * duyt mng 1 chiuint*p=(int*)a +10 1 2 3 4 5 6 7 8 9 10 11

int a[3][4]NMLTContrnngcao

10

VC

& BB

Hngtipcn1

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 1 2 3 4 5 6 7 8 9 10 11

aCxD

0 1 2 i(d,c)? d=i/C c=i%C

NMLTContrnngcao

12

VC

& BB

Hngtipcn1

Nhp / Xut theo ch s mng 2 chiuint 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 +10 1 2

int a[3][4]

a[0]

+1NMLTContrnngcao

14

VC

& BB

Hngtipcn2

Kch thc ca mngvoid 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 a0 1 2 3

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

NMLTContrnngcao

VC

& BB

Hngtipcn2

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 (*)[];

V dint (*ptr)[4];NMLTContrnngcao

17

VC

& BB

Hngtipcn2

Truyn mng cho hmvoid 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 hmvoid 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

& BB

Hngtipcn2

Truyn mng cho hmvoid 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

& BB

Hngtipcn2

Truyn mng cho hmvoid 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 1 2 3 4 5 6 7 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

& BB

Mngcontr Cch 2: Mng 1 chiu cc con tr18 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 63A 3B 3C

23

0 20A 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

VC

& BB

Mngcontr

V dvoid print_strings(char *p[], int n) { for (int i = 0; i