Ch ng 07
CON TR
Tr n Quang
© 2016
CuuDuongThanCong.com
Ch
ng 06: Con tr
/>
K thu t ỏ p trình
1
N i dung
T ch c b nh
ng d ng c a con tr
Mô hình c a con tr
Toán t &
Khai báo tr
Toán t *
Các phép toán
Con tr và m ng
C p phát b nh đ ng
Tr n Quang
© 2016
CuuDuongThanCong.com
Ch
Con tr và c u trúc,
toán t ->
Các ch đ nâng cao
v i con tr
Th
t đánh giá *
và ++, - Con tr
và const
Con tr
đ n con tr
Con tr
void
ng 06: Con tr
/>
K thu t ỏ p trình
2
T ch c b nh th c thi
T ch c b nh
khi ch ng
trình n p vào đ
th c thi
Tr n Quang
© 2016
CuuDuongThanCong.com
Ch
ng 06: Con tr
/>
K thu t ỏ p trình
3
T ch c b nh th c thi
Vùng TEXT
Ch a mã th c thi c a
ch ng trình
Vùng này ch đ c
Có th dùng chung
Tr n Quang
© 2016
CuuDuongThanCong.com
Ch
ng 06: Con tr
/>
K thu t ỏ p trình
4
T ch c b nh th c thi
Vùng DATA
D
li u đã đ c kh i
t o (initialized)
D
li u không đ c
kh i t o (uninitialzed)
g m:
Bi n toàn c c
Bi n t nh (static)
H ng chu i
(Ngu n: />Tr n Quang
© 2016
CuuDuongThanCong.com
Ch
ng 06: Con tr
/>
K thu t ỏ p trình
5
T ch c b nh th c thi
Vùng HEAP
Ch a b nh
xin
c p phát đ ng b i
ng i l p trình
Liên quan đ n ki u
d li u con tr trong
ch ng này
(Ngu n: /> />Tr n Quang
© 2016
CuuDuongThanCong.com
Ch
ng 06: Con tr
/>
K thu t ỏ p trình
6
T ch c b nh th c thi
Vùng STACK
Ch a các bi n
khai báo trong
ch ng trình
Thông tin các
l n g i hàm
Tr n Quang
© 2016
CuuDuongThanCong.com
Ch
ng 06: Con tr
/>
K thu t ỏ p trình
7
ng d ng c a con tr
M ng trong C
Ph i bi t tr c s l ng ph n t t i th i đi m vi t
ch ng trình
Do đó, c n ph i khai báo m t s l ng l n các ô
nh đ s n. Tuy nhiên, t i m t th i đi m nào đó,
ch ng trình có th s s d ng ít h n r t nhi u
lãng phí
Yêu c u: có th nào dùng m ng v i s l ng ph n
t ch c n bi t lúc ch ng trình đang ch y?
=> Dùng con tr
Tr n Quang
© 2016
CuuDuongThanCong.com
Ch
ng 06: Con tr
/>
K thu t ỏ p trình
8
ng d ng c a con tr
M ng trong C
Khi thêm vào và xóa các ph n t trên m ng, c n
ph i d ch ph i và trái nhi u ph n t t n nhi u
th i gian
Yêu c u: Có cách t ch c d li u nào giúp các
phép qu n lý ph n t nói trên nhanh chóng
Gi i pháp:
Tr n Quang
© 2016
S d ng danh sách liên k t dùng con tr
CuuDuongThanCong.com
Ch
ng 06: Con tr
/>
K thu t ỏ p trình
9
Mô hình c a con tr
Bi n a có đ a ch là
0x1234 FFFF
0x1234 FFFF
Bi n p là con tr
ch a đ a ch c a bi n a
Tr n Quang
© 2016
CuuDuongThanCong.com
Ch
ng 06: Con tr
/>
K thu t ỏ p trình
10
Toứn t &
Dùng đ l y đ a ch c a m t bi n
Ví d :
int a = 100;
printf("%d\n", a);
printf("%p\n", &a);
Tr n Quang
© 2016
CuuDuongThanCong.com
Ch
ng 06: Con tr
/>
K thu t ỏ p trình
11
Toứn t &
typedef struct sPoint3D{float x, y, z;} Point3D;
void main(){
Point3D p1 = {1.0f, 2.0f, 3.0f};
printf("%-5.1f\n", p1.x);
In ra đ a ch c a p1
printf("%p\n", &p1);
In ra giá tr c a p1.x
printf("%p\n", &p1.x);
In ra đ a ch c a p1.y
printf("%p\n", &p1.y);
In ra đ a ch c a p1.z
printf("%p\n", &p1.z);
}
Tr n Quang
© 2016
CuuDuongThanCong.com
Ch
ng 06: Con tr
/>
K thu t ỏ p trình
12
Khai bứo con tr
<Tên ki u> *<tên bi n>;
<Tên ki u> *<tên bi n> = 0;
//NULL
<Tên ki u> *<tên bi n> = &<tên bi n b>;
Ví d :
int a;
// bi n s nguyên
int *p1; // con tr đ n s nguyên, giá tr ch a xác đ nh
int *p2 = 0; // con tr đ n s nguyên, giá tr là NULL
int *p3 = &a; // con tr đ n s nguyên, giá tr là đ a ch
c a bi n a
Tr n Quang
© 2016
CuuDuongThanCong.com
Ch
ng 06: Con tr
/>
K thu t ỏ p trình
13
Toứn t *
Toán t * l y giá tr (tham kh o) t i m t đ a ch
Ví d :
int a = 100;
int *p;
p = &a;
printf("a : %d\n", a);
printf("&a : %p\n", &a);
printf("p : %p\n", p);
printf("*p : %d\n", *p);
printf("*&a: %d\n", *&a);
Tr n Quang
© 2016
CuuDuongThanCong.com
Ch
ng 06: Con tr
/>
K thu t ỏ p trình
14
Cức phép toứn trên con tr
T ng, gi m: ++, -C ng, tr : +, C ng, tr k t h p gán: +=, -=
So sánh: ==, !=
Tr n Quang
© 2016
CuuDuongThanCong.com
Ch
ng 06: Con tr
/>
K thu t ỏ p trình
15
Cức phép toứn trên con tr
G i p là con tr có ki u T;
Các phép c ng, tr : làm con tr p t ng hay gi m
m t b i s c a kích th c ki u T
Ví d :
int a = 100;
int *p = &a;
printf("p : %p\n", p);
p++;
printf("p : %p\n", p);
Tr n Quang
© 2016
CuuDuongThanCong.com
Ch
ng 06: Con tr
/>
K thu t ỏ p trình
16
Con tr và m ng
Con tr và m ng có nhi u đi m gi ng nhau. C 2
đ u gi đ a ch c a ô nh
Con tr : gi
đ a ch c a m t ô nh nào đó
M ng: gi
đ a ch c a ph n t đ u tiên
Do đó:
Có th gán m ng vào con tr
Nh ng không th gán con tr vào m ng
Tr n Quang
© 2016
CuuDuongThanCong.com
Ch
ng 06: Con tr
/>
K thu t ỏ p trình
17
Con tr và m ng
Ví d :
Gán m ng vào con tr
a và p gi cùng đ a ch là đ a
int a[5];
ch ph n t đ u tiên c a m ng
int *p = a;
printf ("a =%p\n", a);
printf ("p =%p\n", p);
Tr n Quang
© 2016
CuuDuongThanCong.com
Ch
ng 06: Con tr
/>
K thu t ỏ p trình
18
Con tr và m ng
Con tr và m ng có cùng cách truy c p các ô nh
Dùng toán t [ ]
Dùng toán t * và +
int a[5];
int *p = a;
int id = 2;
a[id] = 100;
p[id] = 100;
Gi ng nhau
*(a + id) = 100;
*(p + id) = 100;
Tr n Quang
© 2016
CuuDuongThanCong.com
Ch
ng 06: Con tr
/>
K thu t ỏ p trình
19
Con tr và m ng
Con tr và m ng c ng có đi m khác nhau:
M ng: các ph n t
c a m ng n m trên STACK
Con tr : Các ph n t
m ng con tr ch đ n có th
trên STACK hay HEAP
Tr n Quang
© 2016
CuuDuongThanCong.com
Ch
ng 06: Con tr
/>
K thu t ỏ p trình
20
C p phứt b nh đ ng
Giúp ng i l p trình t o ra m ng đ ng, không c n
xác đ nh s l ng ph n t c a m ng đ ng t i th i
đi m biên d ch nh m ng t nh
M ng đ ng s đ c c p phát trên HEAP
Vùng nh xin c p phát không t đ ng gi i phóng,
nên C N ra l nh gi i phóng vùng nh sau khi
dùng xong
Tr n Quang
© 2016
CuuDuongThanCong.com
Ch
ng 06: Con tr
/>
K thu t ỏ p trình
21
C p phứt b nh đ ng
Hàm xin c p phát b nh
malloc
calloc
realloc
Hàm gi i phóng b nh
Tr n Quang
© 2016
free
CuuDuongThanCong.com
Ch
ng 06: Con tr
/>
K thu t ỏ p trình
22
C p phát b nh đ ng
p1 = (int*) malloc (num * sizeof(int));
num: s l ng ph n t xin c p phát
sizeof(int): kích th c c a m i ph n t .
num*sizeof(int): s bytes c n thi t đ xin
Tr n Quang
© 2016
CuuDuongThanCong.com
Ch
ng 06: Con tr
/>
K thu t ỏ p trình
23
C p phát b nh đ ng
int *p1;
float *p2;
int n = 100;
xin c p phát b nh
p1 = (int*) malloc (n * sizeof(int));
p2 = (float*) malloc (n * sizeof(float));
free(p1); free(p2);
Tr n Quang
© 2016
CuuDuongThanCong.com
Ch
ng 06: Con tr
/>
K thu t ỏ p trình
24
C p phát b nh đ ng
malloc
int *p1 = (int*)malloc(num*sizeof(int));
if(p1 == NULL){ ...} else { ...}
Hàm malloc tr v NULL n u không xin đ c.
Lúc đó, không th dùng b nh đ c!
Do đó, LUÔN LUÔN ki m tra xem malloc có tr v NULL hay không
Tr n Quang
© 2016
CuuDuongThanCong.com
Ch
ng 06: Con tr
/>
K thu t ỏ p trình
25