Upload
nhu-thuy-phan
View
246
Download
0
Embed Size (px)
Citation preview
TrngihcKhoahcTnhin KhoaCngnghthngtin BmnTinhccs
NHPMNLPTRNH
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