[r]
Trang 1Ch ươ ng 7 Con tr ỏ
I Đ a ch và con tr ị ỉ ỏ
II Con tr , m ng và xâu ký t ỏ ả ự
III Qu n lý b nh v i hàm malloc() và free() ả ộ ớ ớ
IV Bài t p ch ng 7 ậ ươ
Trang 2I Đ a ch và con tr ị ỉ ỏ
1 Đ a ch (h ng con tr ) ị ỉ ằ ỏ
2 Toán t đ a ch & ử ị ỉ
3 Khai báo bi n con tr ế ỏ
4 Truy nh p bi n qua con tr ậ ế ỏ
5 Con tr ỏ void và con tr NULL ỏ
6 Các phép toán trên con trỏ
7 Con tr tr t i con tr ỏ ỏ ớ ỏ
Trang 31 Đ a ch (h ng con tr ) ị ỉ ằ ỏ
M i byte trong b nh máy tính có m t đ a ỗ ộ ớ ộ ị
ch Các đ a ch này là các s b t đ u t 0 tr ỉ ị ỉ ố ắ ầ ừ ở
đi Ví d có 1 MB b nh thì đ a ch th p ụ ộ ớ ị ỉ ấ
nh t là 0 và đ a ch cao nh t là 1.048.575 ấ ị ỉ ấ
B t kỳ ch ng trình nào khi đ c n p vào b ấ ươ ượ ạ ộ
nh đ u chi m m t kho ng đ a ch Đi u đó ớ ề ế ộ ả ị ỉ ề
có nghĩa là m i bi n và m i hàm trong ọ ế ọ
ch ng trình đ u b t đ u t i m t đ a ch c ươ ề ắ ầ ạ ộ ị ỉ ụ
th Hình 7.1 cho th y các đ a ch b nh ể ấ ị ỉ ộ ớ
Trang 41 Đ a ch (h ng con tr ) ị ỉ ằ ỏ ti p ế
Hình 7.1 Đ a ch b nhị ỉ ộ ớ
ch ươ ng trình
655.359
var1 var2
var3
var4
int char float
int
314.810 314.809 314.808 314.807 314.806 314.805 314.804 314.803 314.802 314.801 314.800 314.799 var1 có đ a ch 314.809 ị ỉ
var2 có đ a ch 314.808 ị ỉ var3 có đ a ch 314.804 ị ỉ var4 có đ a ch 314.802 ị ỉ
Trang 52 Toán t đ a ch & ử ị ỉ
Toán t đ a ch ký hi u là &, đ c dùng ử ị ỉ ệ ượ
đ l y đ a ch c a m t bi n Toán t & ể ấ ị ỉ ủ ộ ế ử
ph i đ t tr c tên bi n mu n l y đ a ch ả ặ ướ ế ố ấ ị ỉ
Ví d : Ch ng trình sau s đ a ra đ a ụ ươ ẽ ư ị
ch c a 3 bi n nguyên a, b, c ỉ ủ ế
Trang 63 Khai báo bi n con tr ế ỏ
Vì đ a ch b nh là s nên nó cũng có th l u tr ị ỉ ộ ớ ố ể ư ữ trong m t bi n gi ng nh giá tr c a các ki u int, ộ ế ố ư ị ủ ể char và float M t bi n mà ch a giá tr đ a ch g i là ộ ế ứ ị ị ỉ ọ
bi n con tr hay g i t t là con tr N u m t con tr ế ỏ ọ ắ ỏ ế ộ ỏ
ch a đ a ch c a m t bi n thì ta nói r ng con tr tr ứ ị ỉ ủ ộ ế ằ ỏ ỏ
t i bi n đó.ớ ế
Đ khai báo các bi n con tr ta dùng cú pháp sau:ể ế ỏ
Ki u* Tên_bi n_con_tr ;ể ế ỏ
trong đó Ki uể là ki u d li u c a đ i t ng mà bi n ể ữ ệ ủ ố ượ ế con tr s tr t i D u * có nghĩa là tr t i Nên đ ỏ ẽ ỏ ớ ấ ỏ ớ ể
d u * bên c nh tên ki u đ nh n m nh r ng nó là ấ ạ ể ể ấ ạ ằ
m t ph n c a ki u ch không ph i c a tên bi n con ộ ầ ủ ể ứ ả ủ ế
tr ỏ
Trang 73 Khai báo bi n con tr (ti p) ế ỏ ế
Ví d : ụ
int a;
int* ptr;
ptr = &a;
L nh này khai báo m t bi n con tr có tên là ptr tr t i các ệ ộ ế ỏ ỏ ớ
s nguyên int Nói cách khác con tr ptr có th ch a đ a ch ố ỏ ể ứ ị ỉ
c a các bi n nguyên ủ ế
Đ khai báo nhi u bi n con tr cùng tr t i m t ki u d li u ể ề ế ỏ ỏ ớ ộ ể ữ ệ
ta vi t: ế
Ki u *Bi n1, *Bi n2, *Bi n3,…; ể ế ế ế
M c dù d u * đ c nh tên bi n con tr nh ng v n nên hi u ặ ấ ể ạ ế ỏ ư ẫ ể
nó là m t ph n c a ki u ộ ầ ủ ể
Ví d : int *p, *q; ụ
Trang 83 Khai báo bi n con tr (ti p) ế ỏ ế
Khi khai báo m t bi n con tr thì bi n con tr này ộ ế ỏ ế ỏ
s ch a m t giá tr vô nghĩa (tr khi đ c kh i t o) ẽ ứ ộ ị ừ ượ ở ạ Giá tr vô nghĩa này có th là đ a ch c a m t ô nh ị ể ị ỉ ủ ộ ớ nào đó n m trong ph n ch ng trình c a ta ho c h ằ ầ ươ ủ ặ ệ
đi u hành Đi u này s r t nguy hi m n u ta đ a giá ề ề ẽ ấ ể ế ư
tr vào ô nh do con tr này tr t i B i v y, tr c ị ớ ỏ ỏ ớ ở ậ ướ khi s d ng m t con tr ta ph i đ a đ a ch vào nó.ử ụ ộ ỏ ả ư ị ỉ
Con tr tr t i ki u nào thì ch ch a đ c đ a ch ỏ ỏ ớ ể ỉ ứ ượ ị ỉ
c a các bi n ki u đó Không th gán đ a ch c a ủ ế ể ể ị ỉ ủ
bi n float t i m t con tr tr t i int.ế ớ ộ ỏ ỏ ớ
Trang 94 Truy nh p bi n qua con tr ậ ế ỏ
M t câu h i đ t ra là n u không bi t tên m t ộ ỏ ặ ế ế ộ
bi n mà ch bi t đ a ch c a nó thì có truy ế ỉ ế ị ỉ ủ
nh p đ c vào bi n đó không? Câu tr l i là ậ ượ ế ả ờ
có Con tr ch a đ a ch c a m t bi n nên ta ỏ ứ ị ỉ ủ ộ ế
có th truy nh p bi n qua con tr ể ậ ế ỏ
Đ truy nh p t i bi n do con tr ptr tr t i ta ể ậ ớ ế ỏ ỏ ớ dùng toán t truy nh p gián ti p * đ t tr c ử ậ ế ặ ướ tên bi n con tr : *ptr *ptr t ng đ ng v i ế ỏ ươ ươ ớ tên c a bi n, ch nào dùng đ c tên bi n thì ủ ế ỗ ượ ế
ch đó dùng đ c *ptr ỗ ượ
Trang 104 Truy nh p bi n qua con tr ậ ế ỏ
Toán t truy nh p gián ti p cũng ký hi u là * nh ng ử ậ ế ệ ư
có nghĩa là giá tr c a bi n đ c tr t i b i bi n con ị ủ ế ượ ỏ ớ ở ế
tr n m bên ph i nóỏ ằ ả , khác v i d u * khi khai báo ớ ấ
bi n con tr có nghĩa là ế ỏ tr t iỏ ớ
Ví d :ụ
int v; //Khai báo bi n có ki u intế ể
int* p; //Khai báo bi n con tr p tr t i intế ỏ ỏ ớ
p = &v; //Gán đ a ch c a bi n v cho con tr pị ỉ ủ ế ỏ
v = 3; //Gán 3 vào v
*p = 3; //Gán 3 vào v gián ti p qua con tr pế ỏ
v p
Trang 115 Con tr tr t i ỏ ỏ ớ void và con tr NULL ỏ
Ta bi t r ng con tr tr t i ki u nào thì ch ch a ế ằ ỏ ỏ ớ ể ỉ ứ
đ c đ a ch c a các bi n ki u đó Tuy nhiên trong ượ ị ỉ ủ ế ể C++ còn có m t lo i con tr đa năng có th tr t i ộ ạ ỏ ể ỏ ớ
b t kỳ ki u d li u nào Con tr đó g i là con tr tr ấ ể ữ ệ ỏ ọ ỏ ỏ
t i void Khai báo con tr tr t i void nh sau:ớ ỏ ỏ ớ ư
void* ptr;
Con tr NULL là con tr không tr t i b t c cái gì, ỏ ỏ ỏ ớ ấ ứ
nó ch a giá tr r ng (b ng 0) Đ có con tr r ng ta ứ ị ỗ ằ ể ỏ ỗ gán giá tr 0 vào bi n con tr Ta có th s d ng tên ị ế ỏ ể ử ụ
h ng này đ t o con tr r ng.ằ ể ạ ỏ ỗ
int* ptr=NULL;
Trang 125 Con tr tr t i ỏ ỏ ớ void và con tr NULL (ti p) ỏ ế
Ví d :ụ
int ivar;
float fvar;
int* iptr;
float* fptr;
void* vptr;
iptr = &ivar;
//iptr = &fvar; //l i vì gán float* t i int*ỗ ớ
fptr = &fvar;
//fptr = &ivar; //l i vì gán int* t i float*ỗ ớ
vptr = &ivar; //đ c vì gán int* t i void*ượ ớ
vptr = &fvar; //đ c vì gán float* t i void*ượ ớ
Trang 136 Các phép toán trên con trỏ
Các phép toán s h c: ố ọ
Ch có 4 phép toán dùng đ c v i con tr là +, -, ỉ ượ ớ ỏ ++,
Khi c ng ho c tr bi n con tr v i m t s thì s ộ ặ ừ ế ỏ ớ ộ ố ố
đó ph i nguyên.ả
Các phép toán s h c tác đ ng trên con tr khác ố ọ ộ ỏ
v i bình th ng C th là khi tăng bi n con tr ớ ườ ụ ể ế ỏ lên 1 đ n v thì đ a ch ch a trong bi n con tr ơ ị ị ỉ ứ ế ỏ không tăng lên m t mà tăng lên m t l ng b ng ộ ộ ượ ằ kích th c ki u d li u con tr tr t i (th ng là ướ ể ữ ệ ỏ ỏ ớ ườ
2 v i ki u int, 4 v i ki u float và 8 v i ki u ớ ể ớ ể ớ ể double)
Trang 146 Các phép toán trên con tr (ti p) ỏ ế
Ví d : gi s p là con tr int ch a đ a ch 200, sau khi ụ ả ử ỏ ứ ị ỉ
l nh ệ ++p;
đ c th c hi n thì p s có giá tr là 202 N u p là con tr ượ ự ệ ẽ ị ế ỏ float thì sau l nh trên p s có giá tr là 204 ệ ẽ ị
Các phép toán so sánh: có th so sánh hai ể
bi n con tr b ng các phép toán so sánh Tuy ế ỏ ằ nhiên vi c so sánh này ch có ý nghĩa trong ệ ỉ hai tr ng h p sau: ườ ợ
So sánh hai con tr đ xem chúng có b ng con tr NULL ỏ ể ằ ỏ không.
Trang 156 Các phép toán trên con tr (ti p) ỏ ế
So sánh hai con tr khi chúng cùng liên quan t i m t đ i ỏ ớ ộ ố
t ng, ch ng h n là cùng tr t i m t bi n ượ ẳ ạ ỏ ớ ộ ế
Phép gán: Có th gán m t bi n con tr cho m t ể ộ ế ỏ ộ
bi n con tr có cùng ki u tr t i.ế ỏ ể ỏ ớ
L u ýư : Khi dùng toán t tăng ho c gi m v i bi n do ử ặ ả ớ ế con tr tr t i thì ph i chú ý v th t th c hi n các ỏ ỏ ớ ả ề ứ ự ự ệ phép toán Ví d : n u ta vi tụ ế ế
*p++;
thì con tr s tăng lên 1 ch không ph i bi n do con ỏ ẽ ứ ả ế
tr tr t i tăng lên 1, b i vì phép toán * và ++ cùng ỏ ỏ ớ ở
m c u tiên, đ c k t h p t ph i qua trái Mu n ứ ư ượ ế ợ ừ ả ố tăng bi n do con tr tr t i ta ph i vi t:ế ỏ ỏ ớ ả ế
(*p)++;
Trang 167 Con tr tr t i con tr ỏ ỏ ớ ỏ
Trong C++, m t con tr có th tr t i m t ộ ỏ ể ỏ ớ ộ con tr khác, t c là m t con tr có th ch a ỏ ứ ộ ỏ ể ứ
đ a ch c a m t bi n con tr khác ị ỉ ủ ộ ế ỏ
Giá trị
Bi nế
Đ a chị ỉ Con trỏ
Giá trị
Bi nế
Đ a chị ỉ
Con trỏ
Đ a chị ỉ Con trỏ
Trang 177 Con tr tr t i con tr (ti p) ỏ ỏ ớ ỏ ế
Đ khai báo m t bi n con tr tr t i m t con tr ta dùng ể ộ ế ỏ ỏ ớ ộ ỏ thêm d u * n a Ví d : ấ ữ ụ
int** p; //p là con tr tr t i m t con tr int ỏ ỏ ớ ộ ỏ
Đ truy nh p t i bi n qua con tr tr t i con tr ta ph i dùng ể ậ ớ ế ỏ ỏ ớ ỏ ả hai l n toán t truy nh p gián ti p Ki u truy nh p này g i là ầ ử ậ ế ể ậ ọ truy nh p gián ti p b i (Multiple Indirection) Ví d : ậ ế ộ ụ
char ch;
char* p;
char** mp;
ch='A';
p=&ch;
mp=&p;
cout<<"Ky tu nam trong bien ch la: "<<**mp;
Trang 18II Con tr , m ng và xâu ký t ỏ ả ự
1 Con tr và m ng ỏ ả
2 Con tr và xâu ký t ỏ ự
Trang 191 Con tr và m ng ỏ ả
Con tr đ c s d ng đ truy nh p vào các ph n t c a m ng ỏ ượ ử ụ ể ậ ầ ử ủ ả
và làm đ i s truy n vào hàm Và khi m ng làm đ i s ố ố ề ả ố ố truy n vào hàm thì con tr cũng r t h u ích ề ỏ ấ ữ
Các ph n t c a m ng có th đ c truy nh p qua ký hi u c a ầ ử ủ ả ể ượ ậ ệ ủ
m ng ([]) ho c ký hi u c a con tr (*) Ví d : ả ặ ệ ủ ỏ ụ
int a[5]={31,54,77,52,93};
int i;
//Dua ra bang ky hieu cua mang
for(i=0;i<5;i++) printf("%i ",a[i]);
//Dua ra bang ky hieu cua con tro
for(i=0;i<5;i++) printf("%i ",*(a+i));
Trang 201 Con tr và m ng (ti p) ỏ ả ế
Bi u th c *(a+i) t ng đ ng v i a[i] Ví d , v i ể ứ ươ ươ ớ ụ ớ i=2 thì *(a+2) là ph n t th 3 (có giá tr là 77) ầ ử ứ ị
T i sao *(a+2) l i là ph n t th 3? Nh ta đã bi t, ạ ạ ầ ử ứ ư ế tên bi n m ng chính là đ a ch c a ph n t đ u tiên ế ả ị ỉ ủ ầ ử ầ
c a bi n m ng Khi ta vi t (a+2) thì trình biên d ch ủ ế ả ế ị
s th c hi n c ng đ a ch v i 2 Khi c ng đ a ch v i ẽ ự ệ ộ ị ỉ ớ ộ ị ỉ ớ
2 trình biên d ch l y kích th c ki u d li u c a ị ấ ướ ể ữ ệ ủ
m ng nhân v i 2 r i m i c ng vào đ a ch K t qu ả ớ ồ ớ ộ ị ỉ ế ả (a+2) cho ta đ a ch c a ph n t th 3 Đ truy nh p ị ỉ ủ ầ ử ứ ể ậ
t i ph n t th 3 khi bi t đ a ch ph i s d ng toán ớ ầ ử ứ ế ị ỉ ả ử ụ
t truy nh p gián ti p *(a+2).ử ậ ế