Tải bản đầy đủ (.pdf) (28 trang)

Bài giảng Kỹ thuật lập trình: Chương 7 - Trần Quang

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (545.39 KB, 28 trang )

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


×