[r]
(1)Chương Con trỏ
I Đ a ch trị ỉ ỏ
II Con tr , m ng xâu ký tỏ ả ự
(2)I Đ a ch trị ỉ ỏ
1 Đ a ch (h ng tr )ị ỉ ằ ỏ 2 Toán t đ a ch &ử ị ỉ
3 Khai báo bi n trế ỏ
4 Truy nh p bi n qua trậ ế ỏ
5 Con tr ỏ void tr NULLỏ
(3)1 Đ a ch (h ng tr )ị ỉ ằ ỏ
M i byte b nh máy tính có m t đ a ỗ ộ ớ ộ ị
ch Các đ a ch s b t đ u t tr ỉ ị ỉ ố ắ ầ ừ ở đi Ví d có MB b nh đ a ch th p ụ ộ ớ ị ỉ ấ nh t đ a ch cao nh t 1.048.575.ấ ị ỉ ấ
B t kỳ ch ng trình đ c n p vào b ấ ươ ượ ạ ộ
(4)1 Đ a ch (h ng 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ị ỉ
(5)2 Toán t đ a ch &ử ị ỉ
Toán t đ a ch ký hi u &, đ c dùng ử ị ỉ ệ ượ
(6)3 Khai báo bi n trế ỏ
Vì đ a ch b nh s nên có th l u tr ị ỉ ộ ố ể ữ
trong m t bi n gi ng nh giá tr c a ki u int, ộ ế ố ị ủ ể char float M t bi n mà ch a giá tr đ a ch g i ộ ế ứ ị ị ỉ ọ bi n tr hay g i t t tr N u m t tr ế ỏ ọ ắ ỏ ế ộ ỏ ch a đ a ch c a m t bi n ta nói r ng tr tr ứ ị ỉ ủ ộ ế ằ ỏ ỏ t i bi n đó.ớ ế
Đ khai báo bi n tr ta dùng cú pháp sau:ể ế ỏ
Ki u* Tên_bi n_con_tr ;ể ế ỏ
(7)3 Khai báo bi n tr (ti p)ế ỏ ế
Ví d :ụ
int a; int* ptr; ptr = &a;
L nh khai báo m t bi n tr có tên ptr tr t i ệ ộ ế ỏ ỏ
s nguyên int Nói cách khác tr ptr có th ch a đ a ch ố ỏ ể ứ ị ỉ
c a bi n nguyên.ủ ế
Đ khai báo nhi u bi n tr 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 tr nh ng v n nên hi u ặ ấ ể ế ỏ ẫ ể
nó m t ph n c a ki u.ộ ầ ủ ể
(8)3 Khai báo bi n tr (ti p)ế ỏ ế
Khi khai báo m t bi n tr bi n tr ộ ế ỏ ế ỏ
s ch a m t giá tr vô nghĩa (tr đ c kh i t o) ẽ ứ ộ ị ượ Giá tr vơ nghĩa có th đ a ch c a m t ô nh ị ể ị ỉ ủ ộ n m ph n ch ng trình c a ta ho c h ằ ầ ươ ủ ặ ệ u hành Đi u s r t nguy hi m n u ta đ a giá ề ề ẽ ấ ể ế tr vào ô nh tr tr t i B i v y, tr c ị ỏ ỏ ậ ướ s d ng m t tr ta ph i đ a đ a ch vào nó.ử ụ ộ ỏ ả ị ỉ
Con tr tr t i ki u ch ch a đ c đ a ch ỏ ỏ ể ỉ ứ ượ ị ỉ
(9)4 Truy nh p bi n qua trậ ế ỏ
M t câu h i đ t n u không bi t tên m t ộ ỏ ặ ế ế ộ
bi n mà ch bi t đ a ch c a có truy ế ỉ ế ị ỉ ủ nh p đ c vào bi n khơng? Câu tr l i ậ ượ ế ả ờ có Con tr ch a đ a ch c a m t bi n nên ta ỏ ứ ị ỉ ủ ộ ế có th truy nh p bi n qua tr ể ậ ế ỏ
Đ truy nh p t i bi n tr ptr tr t i ta ể ậ ớ ế ỏ ỏ ớ
(10)4 Truy nh p bi n qua trậ ế ỏ
Toán t truy nh p gián ti p ký hi u * nh ng ậ ế ệ
có nghĩa giá tr c a bi n đ c tr t i b i bi n ị ủ ế ượ ỏ ế tr n m bên ph i nóỏ ằ ả , khác v i d u * khai báo ấ bi n tr có nghĩa ế ỏ tr t iỏ
Ví d :ụ
int v; //Khai báo bi n có ki u intế ể
int* p; //Khai báo bi n tr p tr t i intế ỏ ỏ p = &v; //Gán đ a ch c a bi n v cho tr pị ỉ ủ ế ỏ v = 3; //Gán vào v
*p = 3; //Gán vào v gián ti p qua tr pế ỏ
(11)5 Con tr tr t i ỏ ỏ ớ void tr NULLỏ
Ta bi t r ng tr tr t i ki u ch ch a ế ằ ỏ ỏ ể ỉ ứ
đ c đ a ch c a bi n ki u Tuy nhiên ượ ị ỉ ủ ế ể C++ có m t lo i tr đa có th tr t i ộ ỏ ể ỏ b t kỳ ki u d li u Con tr g i tr tr ấ ể ữ ệ ỏ ọ ỏ ỏ t i void Khai báo tr tr t i void nh sau:ớ ỏ ỏ
void* ptr;
Con tr NULL tr không tr t i b t c gì, ỏ ỏ ỏ ấ ứ
nó ch a giá tr r ng (b ng 0) Đ có tr r ng ta ứ ị ỗ ằ ể ỏ ỗ gán giá tr vào bi n tr Ta có th s d ng tên ị ế ỏ ể ụ h ng đ t o tr r ng.ằ ể ỏ ỗ
(12)5 Con tr tr t i ỏ ỏ ớ void tr NULL (ti p)ỏ ế
Ví d :ụ
int ivar; float fvar; int* iptr; float* fptr; void* vptr; iptr = &ivar;
//iptr = &fvar; //l i gán float* t i int*ỗ fptr = &fvar;
(13)6 Các phép toán trỏ
Các phép tốn s h c:ố ọ
Ch có phép toán dùng đ c v i tr +, -, ỉ ượ ỏ
++,
Khi c ng ho c tr bi n tr v i m t s s ộ ặ ế ỏ ộ ố ố
đó ph i ngun.ả
Các phép tốn s h c tác đ ng tr khác ố ọ ộ ỏ
(14)6 Các phép tốn tr (ti p)ỏ ế
Ví d : gi s p tr int ch a đ a ch 200, sau ụ ả ỏ ứ ị ỉ
l nhệ ++p;
đ c th c hi n p s có giá tr 202 N u p tr ượ ự ệ ẽ ị ế ỏ
float sau l nh p s có giá tr 204.ệ ẽ ị
Các phép tốn so sánh: có th so sánh hai ể
bi n tr b ng phép toán so sánh Tuy ế ỏ ằ nhiên vi c so sánh ch có ý nghĩa ệ ỉ hai tr ng h p sau:ườ ợ
(15)6 Các phép toán tr (ti p)ỏ ế
So sánh hai tr chúng liên quan t i m t đ i ỏ ộ ố
t ng, ch ng h n tr t i m t bi n.ượ ẳ ỏ ộ ế
Phép gán: Có th gán m t bi n tr cho m t ể ộ ế ỏ ộ
bi n tr có ki u tr t i.ế ỏ ể ỏ
L u ýư : Khi dùng toán t tăng ho c gi m v i bi n ử ặ ả ế
con tr tr t i ph i ý v th t th c hi n ỏ ỏ ả ề ứ ự ự ệ phép tốn Ví d : n u ta vi tụ ế ế
*p++;
thì tr s tăng lên ch không ph i bi n ỏ ẽ ứ ả ế tr tr t i tăng lên 1, b i phép tốn * ++ ỏ ỏ m c u tiên, đ c k t h p t ph i qua trái Mu n ứ ượ ế ợ ả ố tăng bi n tr tr t i ta ph i vi t:ế ỏ ỏ ả ế
(16)7 Con tr tr t i trỏ ỏ ớ ỏ
Trong C++, m t tr có th tr t i m t ộ ỏ ể ỏ ớ ộ
con tr khác, t c m t tr có th ch a ỏ ứ ộ ỏ ể ứ đ a ch c a m t bi n tr khác.ị ỉ ủ ộ ế ỏ
Giá trị
Bi nế
Đ a chị ỉ
Con trỏ
Giá trị
Bi nế
Đ a chị ỉ
Con trỏ
Đ a chị ỉ
(17)7 Con tr tr t i tr (ti p)ỏ ỏ ớ ỏ ế
Đ khai báo m t bi n tr tr t i m t tr ta dùng ể ộ ế ỏ ỏ ộ ỏ
thêm d u * n a Ví d :ấ ữ ụ
int** p; //p tr tr t i m t tr intỏ ỏ ộ ỏ
Đ truy nh p t i bi n qua tr tr t i tr ta ph i dùng ể ậ ế ỏ ỏ ỏ ả
hai l n toán t truy nh p gián ti p Ki u truy nh p g i ầ ậ ế ể ậ ọ
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;
(18)II Con tr , m ng xâu ký tỏ ả ự
1 Con tr m ngỏ ả
(19)1 Con tr m ngỏ ả
Con tr đ c s d ng đ truy nh p vào ph n t c a m ng ỏ ượ ụ ể ậ ầ ủ ả
và làm đ i s truy n vào hàm Và m ng làm đ i s ố ố ề ả ố ố
truy n vào hàm tr 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 tr (*) Ví d :ả ặ ệ ủ ỏ ụ
int a[5]={31,54,77,52,93}; int i;
//Dua bang ky hieu cua mang for(i=0;i<5;i++) printf("%i ",a[i]); //Dua bang ky hieu cua tro
(20)1 Con tr m ng (ti p)ỏ ả ế
Bi u th c *(a+i) t ng đ ng v i a[i] Ví d , v i ể ứ ươ ươ ụ
i=2 *(a+2) ph n t th (có giá tr 77) ầ ứ ị
T i *(a+2) l i ph n t th 3? Nh ta bi t, ạ ầ ứ ế