Bài giảng Lập trình C - Chương 7: Con trỏ - Ngô Công Thắng

Với mảng động ta có thể thay đổi kích thước của mảng mà vẫn giữ được nội dung của mảng ban đầu Để thay đổi kích thước một mảng động ta dùng hàm realloc() với cú pháp sau: Trong đó KPT là kiểu phần tử, p là con trỏ trỏ tới mảng động, size-new là kích thước mới của mảng động Nếu thay đổi kích thước không thành công, hàm realloc() sẽ trả về con trỏ rỗng (NULL)

pdf54 trang | Chia sẻ: huongthu9 | Lượt xem: 320 | Lượt tải: 0download
Bạn đang xem trước 20 trang tài liệu Bài giảng Lập trình C - Chương 7: Con trỏ - Ngô Công Thắng, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Bài gi ng Ngôn ng C - Ch ng 7 GV. Ngô Công Th ngả ữ ươ ắ 1 Ch 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ậ ươ Bài gi ng Ngôn ng C - Ch ng 7 GV. Ngô Công Th ngả ữ ươ ắ 2 I. Đ 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ỏ ỏ ớ ỏ Bài gi ng Ngôn ng C - Ch ng 7 GV. Ngô Công Th ngả ữ ươ ắ 3 1. Đ 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 .ể ấ ị ỉ ộ ớ Bài gi ng Ngôn ng C - Ch ng 7 GV. Ngô Công Th ngả ữ ươ ắ 4 1. Đ a ch (h ng con tr ) ị ỉ ằ ỏ ti pế Hình 7.1 Đ a ch b nhị ỉ ộ ớ 0 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ị ỉ Bài gi ng Ngôn ng C - Ch ng 7 GV. Ngô Công Th ngả ữ ươ ắ 5 2. 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.ỉ ủ ế Bài gi ng Ngôn ng C - Ch ng 7 GV. Ngô Công Th ngả ữ ươ ắ 6 3. 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 .ỏ Bài gi ng Ngôn ng C - Ch ng 7 GV. Ngô Công Th ngả ữ ươ ắ 7 3. 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;ụ Bài gi ng Ngôn ng C - Ch ng 7 GV. Ngô Công Th ngả ữ ươ ắ 8 3. 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.ế ớ ộ ỏ ỏ ớ Bài gi ng Ngôn ng C - Ch ng 7 GV. Ngô Công Th ngả ữ ươ ắ 9 4. 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.ỗ ượ Bài gi ng Ngôn ng C - Ch ng 7 GV. Ngô Công Th ngả ữ ươ ắ 10 4. 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 Bài gi ng Ngôn ng C - Ch ng 7 GV. Ngô Công Th ngả ữ ươ ắ 11 5. 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; Bài gi ng Ngôn ng C - Ch ng 7 GV. Ngô Công Th ngả ữ ươ ắ 12 5. 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*ượ ớ Bài gi ng Ngôn ng C - Ch ng 7 GV. Ngô Công Th ngả ữ ươ ắ 13 6. 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). Bài gi ng Ngôn ng C - Ch ng 7 GV. Ngô Công Th ngả ữ ươ ắ 14 6. 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. Bài gi ng Ngôn ng C - Ch ng 7 GV. Ngô Công Th ngả ữ ươ ắ 15 6. 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)++; Bài gi ng Ngôn ng C - Ch ng 7 GV. Ngô Công Th ngả ữ ươ ắ 16 7. 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ỏ Bài gi ng Ngôn ng C - Ch ng 7 GV. Ngô Công Th ngả ữ ươ ắ 17 7. 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; Bài gi ng Ngôn ng C - Ch ng 7 GV. Ngô Công Th ngả ữ ươ ắ 18 II. Con tr , m ng và xâu ký tỏ ả ự 1. Con tr và m ngỏ ả 2. Con tr và xâu ký tỏ ự Bài gi ng Ngôn ng C - Ch ng 7 GV. Ngô Công Th ngả ữ ươ ắ 19 1. 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)); Bài gi ng Ngôn ng C - Ch ng 7 GV. Ngô Công Th ngả ữ ươ ắ 20 1. 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).ử ậ ế Bài gi ng Ngôn ng C - Ch ng 7 GV. Ngô Công Th ngả ữ ươ ắ 21 1. Con tr và m ng (ti p)ỏ ả ế Đ a ch c a các ph n t m ngị ỉ ủ ầ ử ả 31 54 77 52 93 a[0] a[1] a[2] a[3] a[4] a a+1 a+2 a+3 a+4 Đ a ch c a ị ỉ ủ các ph n tầ ử Bài gi ng Ngôn ng C - Ch ng 7 GV. Ngô Công Th ngả ữ ươ ắ 22 1. Con tr và m ng (ti p)ỏ ả ế H ng con tr và bi n con tr :ằ ỏ ế ỏ Tên bi n ế m ng là m t đ a ch c th mà h th ng đã ả ộ ị ỉ ụ ể ệ ố ch n đ đ t m ng. Đ a ch này không th ọ ể ặ ả ị ỉ ể thay đ i và nó đ c duy trì khi bi n m ng ổ ượ ế ả còn t n t i. Ng i ta g i các đ a ch không ồ ạ ườ ọ ị ỉ thay đ i đ c là các h ng con tr . Vì tên bi n ổ ượ ằ ỏ ế m ng a ví d trên là h ng nên ta không th ả ở ụ ằ ể vi t a++ hay a+=2.ế M t đ a ch thì không th thay đ i nh ng ộ ị ỉ ể ổ ư bi n con tr ch a đ a ch thì có th thay đ i. ế ỏ ứ ị ỉ ể ổ Bài gi ng Ngôn ng C - Ch ng 7 GV. Ngô Công Th ngả ữ ươ ắ 23 1. Con tr và m ng (ti p)ỏ ả ế H ng con tr và bi n con tr : (ti p)ằ ỏ ế ỏ ế Ví d sau dùng bi n con tr đ đ a ra các ph n ụ ế ỏ ể ư ầ t c a m ng:ử ủ ả int a[5]={31,54,77,52,93}; int i; int *p=a; //p tro toi phan tu dau tien cua mang a //Dua ra bang bien con tro cout<<"Dua ra bang bien con tro: "<<'\n'; for(i=0;i<5;i++) cout<<*p++<<' '; Bài gi ng Ngôn ng C - Ch ng 7 GV. Ngô Công Th ngả ữ ươ ắ 24 2. Con tr và xâu ký tỏ ự Nh ta đã bi t, xâu ký t th c ch t là m ng ký t . B i ư ế ự ự ấ ả ự ở v y ta có th dùng ký hi u con tr đ truy nh p vào các ậ ể ệ ỏ ể ậ ký t c a xâu gi ng nh truy nh p vào các ph n t c a ự ủ ố ư ậ ầ ử ủ m ng. Ví d :ả ụ char s[6]=”DHNNI”; cout<<*(s+1);//Dua ra ky tu thu 2 la H Con tr tr t i h ng xâu ký t :ỏ ỏ ớ ằ ự Khi khai báo và kh i ở t o bi n xâu ký t ta có th khai báo nh m t m ng ký ạ ế ự ể ư ộ ả t ho c khai báo nh m t con tr tr t i ki u ký t . Ví ự ặ ư ộ ỏ ỏ ớ ể ự d :ụ char s1[] = ”Khai bao nhu mot mang”; s1[1], *(s1+1) //char* s1 = ”Khai bao nhu con con tro”; *(s1+1), s1[1] Bài gi ng Ngôn ng C - Ch ng 7 GV. Ngô Công Th ngả ữ ươ ắ 25 2. Con tr và xâu ký t (ti p)ỏ ự ế Sau khai báo trên ta s đ c hai bi n xâu ký t s1 và s2. Tuy ẽ ượ ế ự nhiên hai bi n xâu này có m t s khác nhau: s1 là m t đ a ế ộ ự ộ ị ch , m t h ng con tr , s2 là m t bi n con tr ; s2 có th thay ỉ ộ ằ ỏ ộ ế ỏ ể đ i còn s1 không th thay đ i. Ví d :ổ ể ổ ụ char s1[]="Khai bao nhu mot mang"; char* s2 ="Khai bao nhu mot con tro"; cout<<s1<<'\n'; cout<<s2<<'\n'; //s1++; //Bao loi, s1 la hang con tro s2++; //Duoc cout<<s2; //Chi hien: hai bao nhu mot con tro Chú ý: Khi thay đ i s2 thì ký t đ u tiên c a xâu s thay đ i. ổ ự ầ ủ ẽ ổ ví d trên, sau khi tăng s2 lên 1 thì ký t đ u tiên c a xâu Ở ụ ự ầ ủ là h. Bài gi ng Ngôn ng C - Ch ng 7 GV. Ngô Công Th ngả ữ ươ ắ 26 2. Con tr và xâu ký t (ti p)ỏ ự ế M ng con tr tr t i các h ng xâu ký t :ả ỏ ỏ ớ ằ ự  Gi ng nh m ng các bi n ki u int ho c float, ta ố ư ả ế ể ặ cũng có m ng con tr . M ng con tr hay dùng ả ỏ ả ỏ nh t là m ng con tr tr t i các h ng xâu ký t .ấ ả ỏ ỏ ớ ằ ự  Ta xét hai cách khai báo sau đây: //Dùng m ng hai chi uả ề char days[7][10]={"Sunday","Monday","Tuesday","Wednesday", "Thursday","Friday","Saturday"}; //Dùng con trỏ char* days[7]={"Sunday","Monday","Tuesday","Wednesday", "Thursday","Friday","Saturday"}; Bài gi ng Ngôn ng C - Ch ng 7 GV. Ngô Công Th ngả ữ ươ ắ 27 2. Con tr và xâu ký t (ti p)ỏ ự ế M ng con tr tr t i các h ng xâu ký t : (ti p)ả ỏ ỏ ớ ằ ự ế N u khai báo theo m ng hai chi u thì các m ng con ế ả ề ả ch a các xâu ký t ph i có kích th c b ng nhau (10). ứ ự ả ướ ằ Do đó, v i nh ng xâu có s ký t nh h n 10 s gây ớ ữ ố ự ỏ ơ ẽ lãng phí b nh .ộ ớ N u khai báo theo con tr thì trình biên d ch C++ s ế ỏ ị ẽ đ các xâu ký t liên tiêp nhau trong b nh và dùng ể ự ộ ớ m t m ng con tr đ tr t i các xâu này (Hình trang ộ ả ỏ ể ỏ ớ sau cho th y các xâu ký t trong b nh ). M t xâu ký ấ ự ộ ớ ộ t là m t m ng ki u char, do đó m t m ng con tr tr ự ộ ả ể ộ ả ỏ ỏ t i xâu ký t th c ch t là m t m ng con tr tr t i ớ ự ự ấ ộ ả ỏ ỏ ớ char. Đây chính là lý do t i sao ta khai báo là char*ạ Bài gi ng Ngôn ng C - Ch ng 7 GV. Ngô Công Th ngả ữ ươ ắ 28 2. Con tr và xâu ký t (ti p)ỏ ự ế S u n d a y \0 M o n d a y \0 T u e f20 0f199 f198 f197 f196 f195 f194 f193 f192 f191 f190 f189 f188 f187 f186 f185 f184 f200 f193 f186 f178 f168 f168 f160 f153 f144 M ng con trả ỏ Các xâu ký tự Đ a ch c a ký t ị ỉ ủ ự đ u tiên chính là ầ đ a ch c a xâu. ị ỉ ủ Các đ a ch này ị ỉ đ c l u tr trong ượ ư ữ m ng con tr .ả ỏ Bài gi ng Ngôn ng C - Ch ng 7 GV. Ngô Công Th ngả ữ ươ ắ 29 Bài t pậ Vi t ch ng trình nh p vào m t h tên. Tách ế ươ ậ ộ ọ tên và đ a tên ra màn hình.ư Bài gi ng Ngôn ng C - Ch ng 7 GV. Ngô Công Th ngả ữ ươ ắ 30 III. Qu n lý b nh v i malloc và freeả ộ ớ ớ 1. Cách s d ng b nh c a m t ch ng trình Cử ụ ộ ớ ủ ộ ươ 2. Các lo i bi n trong ch ng trình Cạ ế ươ 3. H n ch c a m ngạ ế ủ ả 4. Hàm malloc() và free() 5. M ng đ ngả ộ Bài gi ng Ngôn ng C - Ch ng 7 GV. Ngô Công Th ngả ữ ươ ắ 31 1. Cách s d ng b nh c a m t ch ng trình Cử ụ ộ ớ ủ ộ ươ M t ch ng trình C khi ộ ươ ch y s chi m m t vùng ạ ẽ ế ộ nh trong b nh . Vùng ớ ộ ớ nh này đ c chia thành 3 ớ ượ ph n: ph n ch a mã ầ ầ ứ ch ng trình, ph n ch a ươ ầ ứ các bi n tĩnh và bi n ngoài ế ế (g i là Heap), ph n ch a ọ ầ ứ các bi n t đ ng (g i là ế ự ộ ọ Stack). Stack m r ng t ở ộ ừ đ a ch cao xu ng đ a ch ị ỉ ố ị ỉ th p, Heap m r ng t đ a ấ ở ộ ừ ị ch th p lên đ a ch cao.ỉ ấ ị ỉ Đ a ch caoị ỉ Đ a ch th pị ỉ ấ Stack Heap Mã ch ng ươ trình Bi n toàn c cế ụ Bài gi ng Ngôn ng C - Ch ng 7 GV. Ngô Công Th ngả ữ ươ ắ 32 2. Các lo i bi n trong ch ng trình Cạ ế ươ a) S khác nhau gi a khai báo và đ nh nghĩaự ữ ị b) Th i gian t n t i và ph m vi ho t đ ng c a các lo i bi nờ ồ ạ ạ ạ ộ ủ ạ ế Bài gi ng Ngôn ng C - Ch ng 7 GV. Ngô Công Th ngả ữ ươ ắ 33 a) S khác nhau gi a khai báo và đ nh nghĩaự ữ ị M t khai báo (declaration) ch xác đ nh tên và ki u ộ ỉ ị ể d li u. Nhi m v c a khai báo là cung c p thông ữ ệ ệ ụ ủ ấ tin cho trình biên d ch, nó không yêu c u trình biên ị ầ d ch làm b t c vi c gì.ị ấ ứ ệ  Trái l i, m t đ nh nghĩa (definition) yêu c u trình ạ ộ ị ầ biên d ch ph i c p phát b nh cho bi n.ị ả ấ ộ ớ ế  Trong m t s tr ng h p khai báo cũng yêu c u ộ ố ườ ợ ầ trình biên d ch c p phát b nh , ch ng h n nh khai ị ấ ộ ớ ẳ ạ ư báo bi n. Tuy nhiên, v i đ nh nghĩa thì trong b t kỳ ế ớ ị ấ tr ng h p nào cũng yêu c u c p phát b nh .ườ ợ ầ ấ ộ ớ Bài gi ng Ngôn ng C - Ch ng 7 GV. Ngô Công Th ngả ữ ươ ắ 34 b) Th i gian t n t i và ph m vi ho t đ ng c a các lo i ờ ồ ạ ạ ạ ộ ủ ạ bi nế  Các lo i bi n có hai đ c tính chính là ph m vi ho t ạ ế ặ ạ ạ đ ng và th i gian t n t i. Ph m vi ho t đ ng liên ộ ờ ồ ạ ạ ạ ộ quan đ n ph n ch ng trình nào có th truy nh p ế ầ ươ ể ậ (s d ng) bi n. Th i gian t n t i là kho ng th i gian ử ụ ế ờ ồ ạ ả ờ trong đó bi n t n t i. Ph m vi ho t đ ng c a bi n có ế ồ ạ ạ ạ ộ ủ ế th là trong m t l p, m t hàm, m t file hay m t s ể ộ ớ ộ ộ ộ ố file. Th i gian t n t i c a m t bi n có th trùng v i ờ ồ ạ ủ ộ ế ể ớ m t đ i t ng, m t hàm hay toàn b ch ng trình.ộ ố ượ ộ ộ ươ  Có các lo i bi n sau: bi n t đ ng, bi n thanh ghi, ạ ế ế ự ộ ế bi n trong kh i l nh, bi n ngoài, bi n tĩnh.ế ố ệ ế ế Bài gi ng Ngôn ng C - Ch ng 7 GV. Ngô Công Th ngả ữ ươ ắ 35 Các bi n t đ ng (automatic variable)ế ự ộ Các bi n t đ ngế ự ộ là các bi n đ c khai báo ế ượ trong m t hàm. S dĩ g i chúng là các bi n t ộ ở ọ ế ự đ ng b i vì chúng đ c t đ ng t o khi hàm ộ ở ượ ự ộ ạ đ c g i và b h y khi hàm k t thúc.ượ ọ ị ủ ế  Bi n t đ ng có ph m vi ho t đ ng trong m t ế ự ộ ạ ạ ộ ộ hàm. Do đó, m t bi n i đ c khai báo trong m t ộ ế ượ ộ hàm hoàn toàn khác v i m t bi n i đ c khai báo ớ ộ ế ượ trong m t hàm khác.ộ  M c đ nh các bi n t đ ng không đ c kh i t o, ặ ị ế ự ộ ượ ở ạ b i v y ngay sau khi chúng đ c hình thành ở ậ ượ chúng s có m t giá tr vô nghĩa.ẽ ộ ị Bài gi ng Ngôn ng C - Ch ng 7 GV. Ngô Công Th ngả ữ ươ ắ 36 Các bi n thanh ghi (register variable)ế  Bi n thanh ghi là m t lo i bi n t đ ng đ c bi t. Nó ế ộ ạ ế ự ộ ặ ệ đ c đ t trong các thanh ghi c a CPU ch không ượ ặ ủ ứ ph i trong b nh . Vi c truy nh p các bi n thanh ả ộ ớ ệ ậ ế ghi nhanh h n các bi n thông th ng. Bi n thanh ơ ế ườ ế ghi có l i nh t khi đ c dùng làm bi n đi u khi n ợ ấ ượ ế ề ể cho l nh l p bên trong nh t trong các l nh l p l ng ệ ặ ấ ệ ặ ồ nhau. Ta ch nên dùng m t đ n hai bi n thanh ghi ỉ ộ ế ế trong m t hàm.ộ Đ khai báo bi n thanh ghi ta dùng t khóa ể ế ừ register tr c khai báo bi n thông th ng.ướ ế ườ Ví d : ụ register int a; Bài gi ng Ngôn ng C - Ch ng 7 GV. Ngô Công Th ngả ữ ươ ắ 37 Các bi n trong kh i l nhế ố ệ Các bi n t đ ng có th đ c khai báo b t ế ự ộ ể ượ ở ấ kỳ đâu trong m t hàm ho c trong m t kh i ộ ặ ộ ố l nh. Kh i l nh là ph n ch ng trình n m ệ ố ệ ầ ươ ằ gi a hai d u ngo c { và }, ch ng h n nh ữ ấ ặ ẳ ạ ư thân l nh if hay thân l nh l p. Các bi n đ c ệ ệ ặ ế ượ khai báo trong m t kh i l nh có ph m vi ho t ộ ố ệ ạ ạ đ ng ch trong kh i l nh đó.ộ ỉ ố ệ Bài gi ng Ngôn ng C - Ch ng 7 GV. Ngô Công Th ngả ữ ươ ắ 38 Các bi n ngoài (external variable)ế Các bi n ngoài là các bi n đ c khai báo ế ế ượ ở bên ngoài t t c các hàm. Các bi n ngoài có ấ ả ế ph m vi ho t đ ng t v trí khai báo đ n cu i ạ ạ ộ ừ ị ế ố file khai báo chúng. Th i gian t n t i c a các ờ ồ ạ ủ bi n ngoài là th i gian t n t i c a ch ng ế ờ ồ ạ ủ ươ trình, t c là khi ch ng trình k t thúc thì các ứ ươ ế bi n ngoài m i b h y. Khác v i các bi n t ế ớ ị ủ ớ ế ự đ ng, các bi n ngoài đ c t đ ng kh i t o ộ ế ượ ự ộ ở ạ b ng 0 n u ta không kh i t o.ằ ế ở ạ Bài gi ng Ngôn ng C - Ch ng 7 GV. Ngô Công Th ngả ữ ươ ắ 39 Các bi n ngoài (ế ti pế ) //Bat dau file int a; //a la bien ngoai ..... void afunc(); ....... //Cuoi file Bài gi ng Ngôn ng C - Ch ng 7 GV. Ngô Công Th ngả ữ ươ ắ 40 Các bi n ngoài (ế ti pế ) N u ch ng trình đ c chia thành nhi u file ế ươ ượ ề thì các bi n ngoài ch có th dùng đ c trong ế ỉ ể ượ file khai báo chúng, không dùng đ c trong ượ các file khác. Đ s d ng m t bi n ngoài đã ể ử ụ ộ ế đ c đ nh nghĩa m t file thì ta ph i khai ượ ị ở ộ ả báo bi n đó dùng t khóa ế ừ extern. Đ các bi n ngoài ch truy nh p đ c trong ể ế ỉ ậ ượ file khai báo chúng, không truy nh p đ c t ậ ượ ừ file khác ta dùng t khóa ừ static. T khóa ừ static s h n ch ph m vi ho t đ ng c a bi n.ẽ ạ ế ạ ạ ộ ủ ế Ví d : (ụ trang sau) Bài gi ng Ngôn ng C - Ch ng 7 GV. Ngô Công Th ngả ữ ươ ắ 41 Các bi n ngoài (ế ti pế ) Ví d 1: Truy nh p bi n ngoài trên nhi u fileụ ậ ế ề //Bat dau file 1 int a; //a la bien ngoai //Cuoi file 1 //Bat dau file 2 extern int a; //khai bao su dung bien ngoai a o file 1 //Trong file 2 co the truy nhap bien a //Cuoi file 2 //Bat dau file 3 //Khong khai bao su dung bien ngoai a nen trong file 3 // khong the truy nhap bien a //Cuoi file 3 Bài gi ng Ngôn ng C - Ch ng 7 GV. Ngô Công Th ngả ữ ươ ắ 42 Các bi n ngoài (ế ti pế ) Ví d 2: H n ch vi c truy nh p bi n ngoàiụ ạ ế ệ ậ ế //Bat dau file 1 static int a; //dinh nghia bien ngoai a //bien a chi truy nhap duoc trong file nay //Cuoi file 1 //Bat dau file 2 extern int a; //Khong dung duoc khai bao nay //Cuoi file 2 Bài gi ng Ngôn ng C - Ch ng 7 GV. Ngô Công Th ngả ữ ươ ắ 43 Các bi n ngoài (ế ti pế ) Có hai v n đ khi s d ng bi n ngoài:ấ ề ử ụ ế  Vì bi n ngoài có th truy nh p đ c t b t kỳ ế ể ậ ượ ừ ấ hàm nào trong ch ng trình nên r t d b thay đ i ươ ấ ễ ị ổ làm m t d li u.ấ ữ ệ  Vì các bi n ngoài có ph m vi ho t đ ng m i ế ạ ạ ộ ở ọ n i trong ch ng trình nên ta ph i quan tâm đ n ơ ươ ả ế v n đ ki m soát tên bi n đ sao cho không có ấ ề ể ế ể hai bi n nào trùng tên. ế Bài gi ng Ngôn ng C - Ch ng 7 GV. Ngô Công Th ngả ữ ươ ắ 44 Các bi n tĩnh c c b (local static)ế ụ ộ Các bi n tĩnh c c b đ c s d ng khi ta ế ụ ộ ượ ử ụ mu n duy trì giá tr c a m t bi n khai báo ố ị ủ ộ ế trong hàm gi a các l i g i hàm. T c là khi ữ ờ ọ ứ hàm k t thúc bi n tĩnh v n còn và v n ch a ế ế ẫ ẫ ứ giá tr , khi hàm đ c g i l n 2 l i có th s ị ượ ọ ầ ạ ể ử d ng giá tr này. Ph m vi ho t đ ng c a bi n ụ ị ạ ạ ộ ủ ế tĩnh c c b là trong hàm nh ng th i gian t n ụ ộ ư ờ ồ t i c a nó là su t th i gian ch ng trình ch y.ạ ủ ố ờ ươ ạ Bài gi ng Ngôn ng C - Ch ng 7 GV. Ngô Công Th ngả ữ ươ ắ 45 3. H n ch c a vi c l u tr b ng m ngạ ế ủ ệ ư ữ ằ ả M ng r t hay đ c s d ng khi c n l u tr m t s ả ấ ượ ử ụ ầ ư ữ ộ ố l ng l n các bi n hay đ i t ng. Tuy nhiên t i th i ượ ớ ế ố ượ ạ ờ đi m vi t ch ng trình ta ph i xác đ nh kích th c ể ế ươ ả ị ướ c a m ng ch không đ i đ c đ n khi ch ng trình ủ ả ứ ợ ượ ế ươ th c hi n. Đo n ch ng trình sau s sinh ra l i:ự ệ ạ ươ ẽ ỗ printf(“Nhap vao kich thuoc mang: ”);scanf(“%i”,&size); int a[size]; //L i, kích th c m ng ph i là h ngỗ ướ ả ả ằ  Trong nhi u tr ng h p, t i th i đi m vi t ch ng ề ườ ợ ạ ờ ể ế ươ trình ta không bi t đ c là c n bao nhiêu b nh . N u ế ượ ầ ộ ớ ế d trù nhi u mà không dùng h t thì lãng phí b nh , ự ề ế ộ ớ n u d trù ít mà c n l u tr nhi u thì không có ch ế ự ầ ư ữ ề ỗ ch a. V n đ này đ c kh c ph c b ng c ch c p ứ ấ ề ượ ắ ụ ằ ơ ế ấ phát đ ng b nh hàm malloc() và free(). ộ ộ ớ Bài gi ng Ngôn ng C - Ch ng 7 GV. Ngô Công Th ngả ữ ươ ắ 46 4. Hàm malloc() và free() Trong C có 2 hàm th c hi n ch c năng c p phát ự ệ ứ ấ và gi i phóng b nh , đó là hàm malloc() và ả ộ ớ free(). Mu n s d ng hai hàm này trong ch ng ố ử ụ ươ trình ta ph i khai báo s d ng th vi n stdlib ả ử ụ ư ệ (#include). Cú pháp c p phát b nh đ ng nh sau:ấ ộ ớ ộ ư Bi n_con_tr = (ế ỏ Ki u_dl_c a_bi nể ủ ế *) malloc(sizeof(Ki u_dl_c a_bi nể ủ ế )); trong đó Bi n con tr ph i đ c khai báo tr ế ỏ ả ượ ỏ đ n ki u d li u c a bi n.ế ể ữ ệ ủ ế Ví d : int* p=NULL;ụ p = (int*) malloc(sizeof(int)); Bài gi ng Ngôn ng C - Ch ng 7 GV. Ngô Công Th ngả ữ ươ ắ 47 4. Hàm malloc() và free() Hàm malloc() s c p phát m t ô nh trong ph n ẽ ấ ộ ớ ầ nh Heap trong khi ch ng trình đang ch y, đ ớ ươ ạ ủ đ ch a m t giá tr có ki u ể ứ ộ ị ể Ki u_dl_c a_bi nể ủ ế và tr v m t con tr tr t i nó.ả ề ộ ỏ ỏ ớ Vì kích th c ph n Heap có gi i h n nên có th ướ ầ ớ ạ ể s h t. N u ph n nh Heap đã h t mà ta v n c p ẽ ế ế ầ ớ ế ẫ ấ phát thì hàm malloc() s tr v con tr r ng ẽ ả ề ỏ ỗ (NULL). B i v y, luôn luôn ph i ki m tra con ở ậ ả ể tr đ c tr v b i hàm malloc() tr c khi dùng ỏ ượ ả ề ở ướ nó. if(!Bi n_con_tr ) printf(“Cap phat bo nho bi loi!”);ế ỏ Bài gi ng Ngôn ng C - Ch ng 7 GV. Ngô Công Th ngả ữ ươ ắ 48 4. Hàm malloc() và free() (ti pế ) Cú pháp gi i phóng b nh đ c c p phát b i ả ộ ớ ượ ấ ở hàm malloc() free(p); Trong đó p là con tr tr t i vùng nh đ c ỏ ỏ ớ ớ ượ c p phát đ ng b i hàm malloc().ấ ộ ở Hàm free(p) s gi i phóng vùng nh đ c tr ẽ ả ớ ượ ỏ t i b i bi n con tr p. Ch nên dùng hàm ớ ở ế ỏ ỉ free() đ gi i phóng vùng nh đ c c p phát ể ả ớ ượ ấ b i hàm malloc(), calloc() ho c realloc().ở ặ Bài gi ng Ngôn ng C - Ch ng 7 GV. Ngô Công Th ngả ữ ươ ắ 49 4. Hàm malloc() và free() (ti pế ) Ví d v s d ng hàm malloc() và free():ụ ề ử ụ //Khai bao su dung thu vien chuong trinh #include #include int main() { int* p; p = (int*) malloc(sizeof(int)); //cap phat bo nho chua kieu int if(p != NULL) { printf("Cap phat bo nho bi loi“); return 1; } *p=100; //Gan 100 vao o nho vua duoc cap printf(”*p = %i”,*p); //Hien thi noi dung cua o nho vua duoc cap free(p); //Giai phong o nho vua duoc cap return 0; } Bài gi ng Ngôn ng C - Ch ng 7 GV. Ngô Công Th ngả ữ ươ ắ 50 5. C p phát m ng đ ng v i calloc()ấ ả ộ ớ  V i c ch c p phát đ ng b nh ta có th c p phát b nh ớ ơ ế ấ ộ ộ ớ ể ấ ộ ớ cho c m t bi n m ng. Đi u này cho phép xác đ nh s ph n ả ộ ế ả ề ị ố ầ t c a m ng trong khi ch y ch ng trình. Đ c p phát đ ng ử ủ ả ạ ươ ể ấ ộ cho m ng m t chi u ta dùng hàm calloc() v i cú pháp nh ả ộ ề ớ ư sau: Bi n_con_tr = (KPT*) calloc(size, sizeof(KPT));ế ỏ trong đó KTP là ki u ph n t , ể ầ ử size là s ph n t c a m ng. ố ầ ử ủ ả size có th là h ng, bi n ho c bi u th c.ể ằ ế ặ ể ứ int a[100]; int *a = (int*) calloc(100,sizeof(int)); a[0]=25; a[1]=15;  Đ gi i phóng vùng nh c p phát cho m ng ta dùng hàm ể ả ớ ấ ả free() v i đ i s là Bi n con tr tr t i m ng:ớ ố ố ế ỏ ỏ ớ ả free(Bi n_con_tr );ế ỏ Bài gi ng Ngôn ng C - Ch ng 7 GV. Ngô Công Th ngả ữ ươ ắ 51 5. M ng đ ng (ả ộ ti pế ) V i m ng đ ng ta có th thay đ i kích th c c a ớ ả ộ ể ổ ướ ủ m ng mà v n gi đ c n i dung c a m ng ban đ u.ả ẫ ữ ượ ộ ủ ả ầ Đ thay đ i kích th c m t m ng đ ng ta dùng hàm ể ổ ướ ộ ả ộ realloc() v i cú pháp sau:ớ p = (KPT*) realloc(p, size_new); Trong đó KPT là ki u ph n t , ể ầ ử p là con tr tr t i ỏ ỏ ớ m ng đ ng, ả ộ size_new là kích th c m i c a m ng ướ ớ ủ ả đ ng.ộ N u thay đ i kích th c không thành công, hàm ế ổ ướ realloc() s tr v con tr r ng (NULL).ẽ ả ề ỏ ỗ Bài gi ng Ngôn ng C - Ch ng 7 GV. Ngô Công Th ngả ữ ươ ắ 52 5. M ng đ ng (ti p)ả ộ ế Ví d v m ng đ ng:ụ ề ả ộ //Khai bao su dung thu vien chuong trinh #include #include int main() { int* a; int n,i; printf("Nhap vao so phan tu cua mang: ");scanf("%i",&n); a = (int*) calloc(n, sizeof(int));//Cap phat bo nho cho mang n phan tu nguyen if(!a) { printf("Cap phat bo nho bi loi"); return 1; } //Ti p trang sauế Bài gi ng Ngôn ng C - Ch ng 7 GV. Ngô Công Th ngả ữ ươ ắ 53 5. M ng đ ng (ti p)ả ộ ế Ví d v m ng đ ng: (ti p)ụ ề ả ộ ế //Nhap cac gia tri vao mang printf("Nhap vao mang so nguyen:\n" ); for(i=0;i<n;i++) { printf("Nhap vao so thu %i: ",i+1); scanf(“%i“,&a[i]); } //Mo rong kich thuoc mang them 10 phan tu a = (int*) realloc(a, n + 10); //Dua cac so nhap vao ra man hinh printf("Cac so da nhap la:\n"); for(i=0;i<n;i++) printf("%i ",a[i]); free(a); //Giai phong vung nho cap phat cho mang return 0; } Bài gi ng Ngôn ng C - Ch ng 7 GV. Ngô Công Th ngả ữ ươ ắ 54 Bài t p ch ng 7ậ ươ  Bai 1. Cho dãy s nguyên aố 1, a2, a3,, an. S p x p ắ ế dãy s tăng d n. Yêu c u trong ch ng trình có s ố ầ ầ ươ ử d ng m ng đ ng đ ch a dãy s .ụ ả ộ ể ứ ố  Bài 2. Vi t ch ng trình nh p vào m t dãy n s ế ươ ậ ộ ố nguyên, l u dãy s này trong m t danh sách liên k t ư ố ộ ế đ n P. Hãy t o m t danh sách liên k t đ n Q là đ o ơ ạ ộ ế ơ ả ng c c a P.ượ ủ  Bài 3. Vi t ch ng trình nh p vào m t dãy n s ế ươ ậ ộ ố nguyên, l u dãy s này trong m t danh sách liên k t ư ố ộ ế đ n P. Hãy s p x p dãy s theo chi u không gi m ơ ắ ế ố ề ả s d ng ph ng pháp s p x p ch n.ử ụ ươ ắ ế ọ

Các file đính kèm theo tài liệu này:

  • pdfbai_giang_lap_trinh_c_chuong_7_con_tro_ngo_cong_thang.pdf
Tài liệu liên quan