Tham khảo tài liệu ''kỹ thuật lập trình c chuyên nghiệp phần 4'', công nghệ thông tin, kỹ thuật lập trình phục vụ nhu cầu học tập, nghiên cứu và làm việc hiệu quả
Trang 1C t ỏ
Con trỏ Con trỏ –– Pointer Pointer
KhaiKhai báobáo
Cá
Cá t át á tửtử ““ ”” ““**”” “ ”“ ” “+”“+”
CácCác toántoán tửtử ““&&”,”, ““**”,”, “=”,“=”, “+”“+”
NhắcNhắc lạilại vềvề truyềntruyền thamtham sốsố địađịa chỉchỉ
ConCon trỏtrỏ vàvà mảngmảng
Cấ háthát ùù hớhớ độđộ
CấpCấp phátphát vùngvùng nhớnhớ độngđộng
Trang 2 KiểuKiểu concon trỏtrỏ chocho phépphép::
TruyềnTruyền thamtham sốsố kiểukiểu địađịa chỉchỉ
BiểuBiểu diễndiễn cáccác kiểu,kiểu, cấucấu trúctrúc dữdữ liệuliệu độngđộng
LưuLưu trữtrữ dữdữ liệuliệu trongtrong vùngvùng nhớnhớ heapheap
ConCon trỏtrỏ đãđã đượcđược sửsử dụngdụng trongtrong hàmhàm scanfscanf
Trang 3C t ỏ
C t ỏ Kh i bá Kh i bá C C
Con trỏ
Kiể t ỏt ỏ hảihải đđ đị h hĩhĩ t êt ê ộtột kiểkiể ởở đãđãKiểu
Kiểu concon trỏtrỏ phảiphải đượcđược địnhđịnh nghĩanghĩa trêntrên mộtmột kiểukiểu cơcơ sởsở đãđãđược
được địnhđịnh nghĩanghĩa trướctrước đóđó
typedef kiểucơsở * Tênkiểu Tênkiểu; ;
typedef kiểucơsở * Tênkiểu Tênkiểu; ;
//
//PINT PINT là kiểu con trỏ là kiểu con trỏ địa chỉ vùng nhớ kiểu int địa chỉ vùng nhớ kiểu int
PINT // // 1 1 biế biế kiể kiể i t *
PINT p; p; //p, p1: biến kiểu //p, p1: biến kiểu int *
Trang 4double* pd, e, f; /* pd là con trỏ đến double
e and f are double */
char *start, *end;
Trang 5C t ỏ
C t ỏ T á ử “ T á ử “ ””
Con trỏ
Con trỏ Toán tử “ Toán tử “& & ””
““&&””:: toántoán tửtử lấylấy địađịa chỉchỉ củacủa 11 biếnbiến
& :: toántoán tửtử lấylấy địađịa chỉchỉ củacủa 11 biếnbiến
Địa Địa chỉ chỉ của của tất tất cả cả các các biến biến trong trong chương chương trình trình đều đều đã đã được
được chỉ chỉ định định từ từ khi khi khai khai báo báo
Trang 6char c = 'a';
char *p;
a z
Trang 8C t ỏ NULL
Con trỏ NULL
GiáGiá t ịt ị đặđặ biệtbiệt đểđể hỉhỉ ằằ t ỏt ỏ khôkhô ảả lýlý ùù
GiáGiá trịtrị đặcđặc biệtbiệt đểđể chỉchỉ rằngrằng concon trỏtrỏ khôngkhông quảnquản lýlý vùngvùngnào
nào GiáGiá trịtrị nàynày thườngthường đượcđược dùngdùng đểđể chỉchỉ mộtmột concon trỏtrỏkhông
Trang 9j int* p = &i;
Trang 10q
0x1210
}
Trang 11C t ỏ à Mả
Con trỏ và Mảng
BiếBiế kiểkiể ảả làlà địđị hỉhỉ tĩ htĩ h ủủ ộtột ùù hớhớ đđ áá
BiếnBiến kiểukiểu mảngmảng làlà địađịa chỉchỉ tĩnhtĩnh củacủa mộtmột vùngvùng nhớ,nhớ, đượcđược xácxácđịnh
định khikhi khaikhai báo,báo, khôngkhông thaythay đổiđổi trongtrong suốtsuốt chuchu kỳkỳ sốngsống
BiếnBiến concon trỏtrỏ làlà địađịa chỉchỉ độngđộng củacủa mộtmột vùngvùng nhớnhớ đượcđược xácxác
BiếnBiến concon trỏtrỏ làlà địađịa chỉchỉ độngđộng củacủa mộtmột vùngvùng nhớ,nhớ, đượcđược xácxácđịnh
định quaqua phépphép gángán địađịa chỉchỉ khikhi chươngchương trìnhtrình thựcthực thithi
#include <stdio h>
int main() {
Trang 12… printf(“0x%04X %i 0x%04X %i\n“,
Trang 14lệnh hàmhàm malloc,, calloc hoặchoặc toántoán tửtử new củacủa C++C++
VùngVùng nhớnhớ dodo lậplập trìnhtrình viênviên chỉchỉ địnhđịnh phảiphải đượcđược giảigiải phóngphóng
VùngVùng nhớnhớ dodo lậplập trìnhtrình viênviên chỉchỉ địnhđịnh phảiphải đượcđược giảigiải phóngphóngbằng
bằng lệnhlệnh free (malloc,(malloc, calloc)calloc) hoặchoặc toántoán tửtử delete (new)
#include <stdio.h>
int main() {
int *p = new int[10];
Trang 15Cấ hát hát độ độ ll ll () () àà ll ll () () Cấp
Cấp phát phát động động: : malloc malloc() () và và calloc calloc() ()
Trang 16Ví d 1 dù ll ()
Ví dụ 1: dùng malloc()
11 #include #include <stdio <stdio h> h>
1 #include #include <stdio <stdio h> h>
2 #include #include <string <string h> h>
3 #include #include <alloc <alloc h> h>
4 #include #include <process <process h> h>
5 int int main(void) main(void)
6 {{ char char *str *str;;
77 /* /* allocate allocate memory memory for for string string */ */
7 /* /* allocate allocate memory memory for for string string */ */
8 if if ((str ((str = = (char (char *) *) malloc( malloc(10 10)) )) == == NULL) NULL)
9 {{{{
10 printf("Not printf("Not enough enough memory memory to to allocate allocate buffer buffer\\n") n");;
11 exit( exit(11));; /* /* terminate terminate program program if if out out of of memory memory */ */
12 }}
Trang 17Ví d 1 (tt)
13 /* /* copy copy "Hello" "Hello" into into string string */ */
13 /* /* copy copy "Hello" "Hello" into into string string */ */
14 strcpy(str, strcpy(str, "Hello") "Hello");;
15 /* /* display display string string */ */
Trang 18Ví d 2 ll ()
Ví dụ 2: calloc()
11 #include #include <stdio <stdio h> h>
1 #include #include <stdio <stdio h> h>
2 #include #include <alloc <alloc h> h>
3 #include #include <string <string h> gg h>
4 int int main(void) main(void)
5 {{
6 char char *str *str = = NULL NULL;;
7 /* /* allocate allocate memory memory for for string string */ */
8 str str = = (char (char *) (( *) calloc( )) calloc(10 (( ,, 10,, sizeof(char)) sizeof(char));; ( ( )) ));;
9 /* /* copy copy "Hello" "Hello" into into string string */ */
10 strcpy(str, strcpy(str, "Hello") "Hello");;
Trang 19Ví d 2 ll ()
Ví dụ 2: calloc()
11 /* /* display display string string */ */
11 /* /* display display string string */ */
Trang 20Giải hó ù hớ
Giải phóng vùng nhớ
Khi
Khi th átth át khỏikhỏi hàhà áá biếbiế kh ikh i bábá tt hà ẽẽ ““biếbiế
KhiKhi thoátthoát khỏikhỏi hàmhàm, , cáccác biếnbiến khaikhai báobáo trongtrong hàmhàm sẽsẽ ““biếnbiếnmất
mất” ” TuyTuy nhiênnhiên cáccác vùngvùng nhớnhớ đượcđược cấpcấp phátphát độngđộng vẫnvẫn còncòntồn
tồn tạitại vàvà đượcđược ““đánhđánh dấudấu”” làlà đangđang ““đượcđược dùngdùng”” ÆÆ bộbộ nhớnhớtồn
tồn tạitại vàvà đượcđược đánhđánh dấudấu làlà đangđang đượcđược dùngdùng ÆÆ bộbộ nhớnhớcủa
của máymáy tínhtính sẽsẽ hếthết
tmpArraytmpArray = (= (intint *)*)mallocmalloc((ii ** sizeofsizeof((intint));));
tmpArraytmpArray = (= (intint ))mallocmalloc((ii sizeofsizeof((intint));));
} tmpArray ii
Trang 21((mallocmalloc, free), free)
((mallocmalloc, free) , free) ((calloccalloc, free), free)
C C dùngdùng hàmhàm free free đểđể giảigiải phóngphóng vùngvùng nhớnhớ cấpcấp phátphát độngđộng
void free(void *block);
Trang 22Cấ hát l i ù hớ ll
Cấp phát lại vùng nhớ: realloc
Đôi
Đôi khikhi húhú tt ốố ởở ộộ h ặ iảiả bớtbớt kí hkí h th ớth ớ
ĐôiĐôi khikhi chúngchúng tata muốnmuốn mởmở rộngrộng hoặchoặc giảmgiảm bớtbớt kíchkích thướcthướcmảng
mảng
CC dùngdùng hàmhàm reallocrealloc đểđể cấpcấp phátphát lạilại vùngvùng nhớnhớ thựcthực hiệnhiện
C C dùngdùng hàmhàm reallocrealloc đểđể cấpcấp phátphát lạilại vùngvùng nhớnhớ, , thựcthực hiệnhiệnchép
chép nộinội dung dung củacủa vùngvùng nhớnhớ cũcũ sang sang vùngvùng nhớnhớ mớimới
void *
void *reallocrealloc(void *block, (void *block, size t(( ,, size t size); size););
víví dụdụ::
intint **tmpArraytmpArray, N=5,i;, N=5,i;
tmpArraytmpArray ( (intint ))reallocrealloc((tmpArraytmpArray, 7);, 7);
Trang 23Ví d ll ()
Ví dụ: realloc()
11 #i l d <#i l d < tdi htdi h>>
1. #include <#include <stdio.hstdio.h>>
2. #include <#include <alloc.halloc.h>>
7. /* allocate memory for string */
8. strstr = (char *) = (char *) mallocmalloc(10);(10);
Trang 249. /*/* copycopy "Hello""Hello" intointo stringstring */*/
10. strcpy(str,strcpy(str, "Hello")"Hello");;
11. printf("Stringprintf("String isis %%ss\\nn AddressAddress isis %%pp\\n",n", str,str, str)str);;
( h( h *)*) ll ( 2020))
12. strstr == (char(char *)*) realloc(str,realloc(str, 2020));;
13. printf("Stringprintf("String isis %%ss\\nn NewNew addressaddress isis %%pp\\n",n", str,str, str)str);;
14. /*/* freefree memorymemory */*/
15. free(str)free(str);;
16. returnreturn 00;;
17. }}