kỹ thuật lập trình C chuyên nghiệp phần 4 ppsx

24 286 0
kỹ thuật lập trình C chuyên nghiệp phần 4 ppsx

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

CtỏCtỏ PitPit C on t r ỏ C on t r ỏ –– P o i n t er P o i n t er  KhaiKhai báobáo CáCá tátá tửtử ““ ”” ““ ** ”” “”“” “+”“+”  Cá c Cá c t o á n t o á n tửtử ““ && ” , ” , ““ ** ” , ” , “ = ” , “ = ” , “+”“+”  NhắcNhắclạilạivềvề truyềntruyền thamtham sốsốđịađịachỉchỉ  ConCon trỏtrỏ vàvà mảngmảng  CấCấ háthát ùù hớhớ độđộ  Cấ p Cấ p phátphát v ù ngv ù ng n hớ n hớ độ ng độ ng CtỏCtỏ Mộ ố lý d ê ử dMộ ố lý d ê ử d C on t r ỏ C on t r ỏ –– Mộ t s ố lý d o n ê n s ử d ụng Mộ t s ố lý d o n ê n s ử d ụng  ConCon trỏtrỏ làlà kiểukiểudữdữ liệuliệulưulưutrữtrữđịađịachỉchỉ củacủa cáccác vùngvùng dữdữ liệuliệu trongtrong bộbộ nhớnhớ máymáy tínhtính ểể  Ki ể uKi ể uconcon trỏtrỏ chocho p hép p hép::  TruyềnTruyền thamtham sốsố kiểukiểu địađịachỉchỉ ểể ễễ ểể ấấ  Bi ể uBi ể udi ễ ndi ễ n cáccác ki ể u,ki ể u, c ấ uc ấ utrúctrúc d ữ d ữ liệuliệu độngđộng  LưuLưutrữtrữ dữdữ liệuliệu trongtrong vùngvùng nhớnhớ heapheap  ConCon trỏtrỏđãđã đượcđượcs ử s ử dụngdụng trongtrong hàmhàm scanfscanf CtỏCtỏ Kh i bá CKh i bá C C on t r ỏ C on t r ỏ –– Kh a i bá o trong CKh a i bá o trong C KiểKiể t ỏt ỏ hảihải đđ đị hđị h hĩhĩ têtê ộtột kiểkiể ởở đãđã Kiể u Kiể uconcon t r ỏt r ỏ phảiphải đ ược đ ược đị n hđị n h ng hĩ ang hĩ a t r ê n t r ê nm ột m ột kiể u kiể ucơcơ s ở s ở đãđã đượcđược địnhđịnh nghĩanghĩatrướctrước đóđó typedeftypedef kiểucơsởkiểucơsở ** TênkiểuTênkiểu ;; typedeftypedef kiểucơsởkiểucơsở ** TênkiểuTênkiểu ;; typedeftypedef intint **PINT;PINT; ////PINTPINT 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 intint x;x; PINTPINT // 1 biế kiể// 1 biế kiể it*it* PINTPINT p;p; // p, p 1 : biế n kiể u // p, p 1 : biế n kiể u i n t *i n t * intint *p1;*p1; CtỏCtỏ Kh i bá t CKh i bá t C C on t r ỏ C on t r ỏ –– Kh a i bá o t rong CKh a i bá o t rong C int *pi; long int *p; long int *p; float* pf; char c, d, *pc; /* c và d kiểu char pc là con trỏ đến char */ double* pd, e, f; /* pd là con trỏ đến double e and f are double */ char *start, *end; CtỏCtỏ Tá ử “Tá ử “ ”” C on t r ỏ C on t r ỏ T o á n t ử “T o á 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Địachỉchỉ củacủatấttấtcảcả cáccác biếnbiếntrongtrong chươngchương trìnhtrình đềuđều đãđã đượcđược chỉchỉ địnhđịnh từtừ khikhi khaikhai báobáo đượcđược chỉchỉ địnhđịnh từtừ khikhi khaikhai báobáo char g = 'z'; 0x1132 g int main() { p c 'a' { char c = 'a'; char *p; p = &c; 0x1132 p g 0x91A2 p = &c; p = &g; return 0; } 'z' 0x91A2 } CtỏCtỏ Tá ử “*”Tá ử “*”  ““ ** ”” :: toántoán tửtử truytruy xuấtxuất giágiá trịtrị củacủa vùngvùng nhớnhớ đượcđược quảnquản lýlý C on t r ỏ C on t r ỏ T o á n t ử “*”T o á n t ử “*”  ** :: toántoán tửtử truytruy xuấtxuất giágiá trịtrị củacủa vùngvùng nhớnhớ đượcđược quảnquản lýlý bởibởiconcon trỏtrỏ #include <stdio.h> char g = 'z'; int main () a 0x1132 p c 'a' 0x1132 () { char c = 'a'; char * p; a z 0 91A2 0x1132 p g '' char p; p = &c; printf("%c\n", *p); p = &g; xuấtgiátrị do p đang 0 x 91A2 ' z ' 0x91A2 p = &g; printf("%c\n", *p); return 0; } xuất giá trị do p đang quản lý } CtỏCtỏ T ề h ố đị hỉT ề h ố đị hỉ C on t r ỏ C on t r ỏ T ruy ề n t h am s ố đị a c hỉT ruy ề n t h am s ố đị a c hỉ #include <stdio.h> void change(int *v); int main() int main() { int var = 5; change(&var); change(&var); printf("main: var = %i\n", var); return 0; } } void change(int *v) { (*v) *= 100; printf("change: *v = %i\n", (*v)); } Ctỏ NULLCtỏ NULL C on t r ỏ NULLC on t r ỏ NULL  GiáGiá t ịt ị đặđặ biệtbiệt đểđể hỉhỉ ằằ t ỏt ỏ khôkhô ảả lýlý ùù  GiáGiá t r ịt r ị đặ c đặ c biệtbiệt đểđể c hỉ c hỉ r ằ ngr ằ ng concon t r ỏt r ỏ khô ng khô ng qu ả nqu ả n lýlý v ù ngv ù ng nàonào GiáGiá trịtrị nàynày thườngthường đượcđượcdùngdùng đểđể chỉchỉ mộtmộtconcon trỏtrỏ khôngkhông hợphợp lệlệ khôngkhông hợphợp lệlệ #include <stdio.h> int main() int main() { int i = 13; short *p = NULL; if (p == NULL) printf(“Con trỏ không hợp lệ!\n"); else printf(“Giá trị : %hi\n", *p); return 0 ; ; } CtỏCtỏ Tá ử á“”Tá ử á“” C on t r ỏ C on t r ỏ T o á n t ử g á n “ = ”T o á n t ử g á n “ = ”  CóCó khákhá biệtbiệt ấtất tt khikhi thth hiệhiệ áá héhé áá 0 15A0  CóCó s ự s ự khá c khá c biệtbiệt r ất r ất quanquan t rọng t rọng khikhi th ực th ực hiệ n hiệ nc á cc á c phé p phé pg á ng á n:: int i = 10, j = 14; p i 10 14 0 x 15A0 j int* p = &i; int *q = &j; 10 0x15A0 14 q j 0x15A4 *p = *q; và: 0x15A4 14 0x15A0 int i = 10, j = 14; int * p = &i ; p i 10 0x15A4 p; int *q = &j; p=q; 0x15A0 q j 0x15A4 14 p = q; 0x15A4 L ệ tậL ệ tậ Điề àô ốĐiề àô ố L uy ệ n tậ p L uy ệ n tậ p –– Điề n v à o ô tr ố ng Điề n v à o ô tr ố ng int main(void) { int i=10 j=14 k; i 0x2100 int i = 10 , j = 14 , k; int *p = &i; int *q = &j; j 0x2104 *p += 1; p = &k; k 0x1208 *p = *q; p = q; *p = *q; p 0x120B q return 0; } q 0x1210 } [...]... C phát độ : malloc() và calloc() động: ll ll Hàm ll Hà malloc và calloc cho phép c p phát c c vùng nhớ à ll h hé ấ hát á ù hớ ngay trong l c chạy chương trình trình void *malloc( size_t size); *malloc( void *calloc( size_t nItems, size_t size); *calloc( nItems, Hàm calloc c p phát vùng nhớ và kh i tạo tất c c c bi ll ấ h h khởi ấ bit trong vùng nhớ mới c p phát về 0 Hàm malloc chỉ c p phát vùng nhớ... nhớ động C thể chỉ đị h vùng mới cho 1 con t ỏ quản lý bằ c c hỉ định ù ới h trỏ ả bằng á lệnh hàm malloc, calloc ho c toán tử new c a C+ + malloc, Vùng nhớ do lập trình viên chỉ định phải đư c giải phóng bằng lệnh free (malloc, calloc) ho c toán tử delete (new) #include int main() { int *p = new int[10]; p[0] = 1; p[3] = -7; 7; delete []p; return 0; } C p hát động malloc() à calloc() C phát... malloc, (calloc, free) calloc, C dùng hàm free để giải phóng vùng nhớ c p phát động động void free(void *block); C phát l i vùng nhớ: realloc C p hát lại ù hớ ll Đôi khi chúng t muốn mở rộng h ặ giảm bớt kích th ớ hú ta ố ở ộ ho c iả kí h thư c mảng mảng C dùng hàm realloc để c p phát lại vùng nhớ, th c hiện nhớ, chép nội dung c a vùng nhớ c sang vùng nhớ mới mới void *realloc(void *block, size_t.. .C t ỏ và Mả Con trỏ à Mảng Biến kiểu ả Biế kiể mảng là đị chỉ tĩnh c a một vùng nhớ, đ địa hỉ tĩ h ủ ột ù hớ đư c x c á định khi khai báo, không thay đổi trong suốt chu kỳ sống sống Biến con trỏ là địa chỉ động c a một vùng nhớ đư c x c nhớ, định qua phép gán địa chỉ khi chương trình th c thi thi #include int main() { int a[10] = {1 3 4 2 0}; {1, 3, 4, 2, int *p; p... nhiên c c vùng nhớ đư c cấp phát động vẫn c n tồn tại và đư c “đánh dấu” là đang “đư c dùng” bộ nhớ dấu” dùng” c a máy tính sẽ hết hết ví dụ: dụ: ụ void aFunction(void) aFunction(void) { int tmpArray, i *tmpArray, i = 5; tmpArray = (int *)malloc(i * sizeof(int)); (int *)malloc( sizeof(int)); )malloc } tmpArray i Giải phóng vùng nhớ: f hó ù nhớ: free hớ Sử d dụng c c cặp hà á ặ hàm (malloc, free) malloc,... printf(“0x%04X %i 0 %04X %i\ “ i tf(“0 %04X 0x%04X %i\n“, a, a[0], p, *p); return 0; } Con trỏ Toán ử “+” ới ố C t ỏ - T á tử “ ” với số nguyên ê #include int main() { short a[10] = {1, 3, 5, 2, 0}; short *p = a; printf( 0x%04X printf(“0x%04X %i 0x%04X %i\n“, %i\n a, a[0], p, *p); p ++; printf(“0x%04X %i 0 %04X %i\ “ i tf(“0 %04X 0x%04X %i\n“, a, a[0], p, *p); (*p) ++; printf(“0x%04X %i 0x%04X %i\n“,... chỉ c p phát vùng nhớ nhớ Ví d 1 dùng malloc() dụ 1: dù ll () 1 1 2 3 4 5 6 7 7 8 9 10 11 12 #include . v à v à ca ll occa ll oc ()() HàHà llll àà llll hh héhé ấấ háthát áá ùù hớhớ  Hà m Hà mma ll ocma ll oc v à v à ca ll occa ll oc c h oc h o phé p phé pc ấ pc ấ p phátphát c á cc á cv ù ngv ù ng n hớ n hớ ngayngay trongtrong lúcl c chạychạychươngchương trìnhtrình void *void *mallocmalloc(. “ && ””  ““ && ”” :: 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Địachỉchỉ c acủatấttấtc c c cc c biếnbiếntrongtrong chươngchương trìnhtrình đềuđều. ỏ ảả lýlý bằbằ áá  C C thểthể c hỉ c hỉ đị n hđị n h v ù ngv ù ng m ới m ới c h oc h o 11 concon t r ỏt r ỏ qu ả nqu ả n lýlý bằ ng bằ ng c á cc á c lệnhlệnh hàmhàm mallocmalloc,, calloccalloc hoặcho c toántoán

Ngày đăng: 22/07/2014, 16:21

Từ khóa liên quan

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan