Bài giảng Hệ thống máy tính và ngôn ngữ C - Chương 12: Pointer

pdf 110 trang phuongnguyen 2630
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Hệ thống máy tính và ngôn ngữ C - Chương 12: Pointer", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pdfbai_giang_ky_thuat_lap_trinh_chuong_12_pointer.pdf

Nội dung text: Bài giảng Hệ thống máy tính và ngôn ngữ C - Chương 12: Pointer

  1. CHÖÔNG 12 POINTER CHÖÔNG 12 POINTER 12.1 Khaùi nieäm 12.7 Pointer vaø vieäc ñònh vò 12.2 Thao taùc treân POINTER boä nhôù ñoäng 12.3 POINTER vaø maûng 12.8 Maûng caùc pointer 12.4 Ñoái soá cuûa haøm laø pointer - 12.9 Pointer cuûa pointer truyeàn ñoái soá theo soá daïng tham 12.10 Ñoái soá cuûa haøm MAIN soá bieán 12.11 Pointer troû ñeán haøm 12.5 Haøm traû veà pointer vaø 12.12 ÖÙng duïng maûng Baøi taäp cuoái chöông 12.6 Chuoãi kyù töï
  2. CHÖÔNG 12 POINTER 12.1 KHAÙI NIEÄM Trong ngoân ngöõ C, moãi bieán vaø chuoãi kyù töï ñeàu ñöôïc löu tröõ trong boä nhôù vaø coù ñòa chæ rieâng, ñòa chæ naøy xaùc ñònh vò trí cuûa chuùng trong boä nhôù. Khi laäp trình trong C, nhieàu luùc chuùng ta caàn laøm vieäc vôùi caùc ñòa chæ naøy, vaø C uûng hoä ñieàu ñoù khi ñöa ra kieåu döõ lieäu pointer (taïm dòch laø con troû) ñeå khai baùo cho caùc bieán löu ñòa chæ.
  3. CHÖÔNG 12 POINTER 12.1 KHAÙI NIEÄM Moät bieán coù kieåu pointer coù theå löu ñöôïc döõ lieäu trong noù, laø ñòa chæ cuûa moät ñoái töôïng ñang khaûo saùt. Ñoái töôïng ñoù coù theå laø moät bieán, moät chuoãi hoaëc moät haøm.
  4. CHÖÔNG 12 POINTER 12.1 KHAÙI NIEÄM Ví duï 13.1: Chöông trình ñoåi trò #include void Swap (int doi_1, int doi_2); main() { int a = 3, b = 4;// Khai baùo vaø khôûi ñoäng trò // In trò tröôùc khi goïi haøm printf (“Tröôùc khi goïi haøm, trò cuûa bieán a = %d, b = %d.\n”); // Goïi haøm ñoåi trò Swap (a, b); // In trò sau khi goïi haøm printf (“Sau khi goïi haøm, trò cuûa bieán a = %d, b = %d.\n”);}
  5. CHÖÔNG 12 POINTER 12.1 KHAÙI NIEÄM Ví duï 13.1: Chöông trình ñoåi trò void Swap (int doi_1, int doi_2) { int temp = doi_1; doi_1 = doi_2 ; doi_2 = temp ; } Tröôùc khi goïi haøm, trò cuûa bieán a = 3, b = 4. Sau khi goïi haøm, trò cuûa bieán a = 3, b = 4.
  6. CHÖÔNG 12 POINTER 12.1 KHAÙI NIEÄM Hình aûnh stack thöïc thi khi ñieàu khieån chöông trình ñang ôû doøng doi_1 = doi_2 ;
  7. CHÖÔNG 12 POINTER 12.1 KHAÙI NIEÄM Hình aûnh stack thöïc thi khi ñieàu khieån ñeán cuoái chöông trình
  8. CHÖÔNG 12 POINTER 12.2 THAO TAÙC TREÂN POINTER 12.2.1 Khai baùo bieán pointer - pointer haèng Trong ngoân ngöõ C coù moät toaùn töû laáy ñòa chæ cuûa moät bieán ñang laøm vieäc, toaùn töû naøy laø moät daáu & (ampersand), taïm goïi laø toaùn töû laáy ñòa chæ. Cuù phaùp nhö sau: & bieán vôùi bieán laø moät bieán thuoäc kieåu baát kyø, nhöng khoâng ñöôïc laø bieán thanh ghi.
  9. CHÖÔNG 12 POINTER 12.2 THAO TAÙC TREÂN POINTER 12.2.1 Khai baùo bieán pointer - pointer haèng Ví duï: Neáu coù moät bieán ñaõ ñöôïc khai baùo laø int heä_soá_a; thì & heä_soá_a seõ laø ñòa chæ cuûa bieán heä_soá_a.
  10. CHÖÔNG 12 POINTER 12.2 THAO TAÙC TREÂN POINTER 12.2.1 Khai baùo bieán pointer - pointer haèng Cuù phaùp ñeå khai baùo bieán pointer: kieåu * teân_bieán_pointer vôùi - kieåu coù theå laø kieåu baát kyø, xaùc ñònh kieåu döõ lieäu coù theå ñöôïc ghi vaøo ñoái töôïng maø con troû ñang troû ñeán. - teân_bieán_pointer laø teân cuûa bieán con troû, moät danh hieäu hôïp leä.
  11. CHÖÔNG 12 POINTER 12.2 THAO TAÙC TREÂN POINTER 12.2.1 Khai baùo bieán pointer - pointer haèng Bieán hoaëc ñoái töôïng maø con troû ñang troû ñeán coù theå ñöôïc truy xuaát qua teân cuûa bieán con troû vaø daáu "*" ñi ngay tröôùc bieán con troû, cuù phaùp cuï theå nhö sau: * teân_bieán_con_troû
  12. CHÖÔNG 12 POINTER 12.2 THAO TAÙC TREÂN POINTER 12.2.1 Khai baùo bieán pointer - pointer haèng Ví duï: Xeùt ví duï sau: int object; int *pint; object = 5; pint = &object;
  13. CHÖÔNG 12 POINTER 12.2 THAO TAÙC TREÂN POINTER 12.2.1 Khai baùo bieán pointer - pointer haèng Ví duï: AND R0, R0, #0 ; xoùa R0 ADD R0, R0, #5 ; R0 = 5 STR R0, R5, #0 ; object = 5 ADD R0, R5, #0 ; R0 = R5 + 0; R0 chöùa ñòa chæ cuûa bieán object STR R0, R5, #-1 ; R5 – 1: ñòa chæ cuûa bieán pint, pint <- R0
  14. CHÖÔNG 12 POINTER 12.2 THAO TAÙC TREÂN POINTER 12.2.1 Khai baùo bieán pointer - pointer haèng Ví duï: Xeùt caùc khai baùo sau: int a, b; int *pa; Sau khi khai baùo, ta coù ba oâ nhôù cho ba bieán a, b vaø pa nhö sau:
  15. CHÖÔNG 12 POINTER
  16. CHÖÔNG 12 POINTER
  17. CHÖÔNG 12 POINTER 12.2 THAO TAÙC TREÂN POINTER 12.2.1 Khai baùo bieán pointer - pointer haèng Ví duï: void * pvoid; int a, * pint; double b, * pdouble; pvoid = (void *) &a; pint = (int *) pvoid; (*pint) ++; pvoid = (void *) &b; pdouble = (double *) pvoid; (*pdouble) ;
  18. CHÖÔNG 12 POINTER 12.2 THAO TAÙC TREÂN POINTER 12.2.2 Caùc pheùp toaùn treân pointer Coù theå coäng, tröø moät pointer vôùi moät soá nguyeân (int, long, ). Keát quaû laø moät pointer. Ví duï : int *pi1, *pi2, n; pi1 = &n; pi2 = pi1 + 3;
  19. CHÖÔNG 12 POINTER 12.2 THAO TAÙC TREÂN POINTER 12.2.2 Caùc pheùp toaùn treân pointer Ví duï: Cho khai baùo int a[20]; int *p; p = &a[0]; p += 3; /* p löu ñòa chæ phaàn töû a[0 + 3], töùc &a[3] */
  20. CHÖÔNG 12 POINTER 12.2 THAO TAÙC TREÂN POINTER 12.2.2 Caùc pheùp toaùn treân pointer Khoâng theå thöïc hieän caùc pheùp toaùn nhaân, chia, hoaëc laáy dö moät pointer vôùi moät soá, vì pointer löu ñòa chæ, neân neáu thöïc hieän ñöôïc ñieàu naøy cuõng khoâng coù moät yù nghóa naøo caû. Pheùp tröø giöõa hai pointer vaãn laø moät pheùp toaùn hôïp leä, keát quaû laø moät trò thuoäc kieåu int bieåu thò khoaûng caùch (soá phaàn töû) giöõa hai pointer ñoù.
  21. CHÖÔNG 12 POINTER 12.2 THAO TAÙC TREÂN POINTER 12.2.2 Caùc pheùp toaùn treân pointer Ví duï: Xeùt chöông trình ví duï sau: #include #include main() { int *p1, *p2; int a[10]; clrscr(); p1 = &a[0];
  22. CHÖÔNG 12 POINTER 12.2 THAO TAÙC TREÂN POINTER 12.2.2 Caùc pheùp toaùn treân pointer Ví duï: p2 = &a[5]; printf ("Dia chi cua bien a[0] la: %p\n", p1); printf ("Dia chi cua bien a[5] la: %p\n", p2); printf ("Khoang cach giua hai phan tu la %d int\n", p2 - p1); getch(); }
  23. CHÖÔNG 12 POINTER 12.2 THAO TAÙC TREÂN POINTER 12.2.2 Caùc pheùp toaùn treân pointer Chöông trình seõ cho xuaát lieäu ví duï: Dia chi cua bien a[0] la: FFE2 Dia chi cua bien a[5] la: FFEC Khoang cach giua hai phan tu la 5 int
  24. CHÖÔNG 12 POINTER 12.2 THAO TAÙC TREÂN POINTER 12.2.2 Caùc pheùp toaùn treân pointer Ví duï: Cho caùc khai baùo sau: int * a1; char * a2; a1 = 0; /* Chöông trình dòch seõ nhaéc nhôû leänh naøy */ a2 = (char *)0; if( a1 != a2) /* Chöông trình dòch seõ nhaéc nhôû kieåu cuûa ñoái töôïng */ { a1 = (int *) a2; /* Hôïp leä vì ñaõ eùp kieåu */ }
  25. CHÖÔNG 12 POINTER 12.2 THAO TAÙC TREÂN POINTER 12.2.2 Caùc pheùp toaùn treân pointer Ví duï: #include #include main() { int *pint, a = 0 6141; char *pchar; clrscr(); pint = &a; pchar = (char *) &a;
  26. CHÖÔNG 12 POINTER 12.2 THAO TAÙC TREÂN POINTER 12.2.2 Caùc pheùp toaùn treân pointer Ví duï: printf ("Tri cua bien pint la: %p\n", pint); printf ("Tri cua bien pchar la: %p\n", pchar); printf ("Doi tuong pint dang quan ly la %X \n", *pint); printf ("Doi tuong pchar dang quan ly la %c \n", *pchar); pchar++; printf ("Doi tuong pchar dang quan ly la %c \n", *pchar); getch(); }
  27. CHÖÔNG 12 POINTER 12.2 THAO TAÙC TREÂN POINTER 12.2.2 Caùc pheùp toaùn treân pointer Chöông trình cho xuaát lieäu ví duï: Tri cua bien pint la: FFF4 Tri cua bien pchar la: FFF4 Doi tuong pint dang quan ly la 6141 Doi tuong pchar dang quan ly la A Doi tuong pchar dang quan ly la a
  28. CHÖÔNG 12 POINTER 12.2 THAO TAÙC TREÂN POINTER 12.2.2 Caùc pheùp toaùn treân pointer C cho pheùp khai baùo moät bieán pointer laø haèng hoaëc ñoái töôïng cuûa moät pointer laø haèng.
  29. CHÖÔNG 12 POINTER 12.2 THAO TAÙC TREÂN POINTER 12.2.2 Caùc pheùp toaùn treân pointer Caùc khai baùo sau ñaây laø bieán pointer haèng: 1. int a, b; int * const pint = &a; pint = &b; C baùo loãi 2. char * const ps = "ABCD";
  30. CHÖÔNG 12 POINTER 12.2 THAO TAÙC TREÂN POINTER 12.2.2 Caùc pheùp toaùn treân pointer Caùc khai baùo sau ñaây cho thaáy ñoái töôïng cuûa moät pointer laø haèng: 1. int i; const int * pint; pint = &i; i = 1; (*pint) ++; C baùo loãi i++; 2. const char * s = "ABCD" hoaëc char const * s = "ABCD";
  31. CHÖÔNG 12 POINTER 12.2 THAO TAÙC TREÂN POINTER 12.2.2 Caùc pheùp toaùn treân pointer Phaân bieät: const tröôùc * : pointer chæ ñeán ñoái töôïng haèng * tröôùc const : pointer haèng
  32. CHÖÔNG 12 POINTER 12.3 POINTER VAØ MAÛNG Trong C, teân maûng laø moät haèng pointer tôùi phaàn töû coù kieåu laø kieåu cuûa bieán thaønh phaàn döôùi noù moät baäc trong maûng, VD: teân cuûa maûng moät chieàu cuûa caùc int laø pointer chæ tôùi int, teân cuûa maûng hai chieàu cuûa caùc int laø pointer chæ tôùi maûng moät chieàu laø haøng caùc int trong maûng. Trong tröôøng hôïp maûng moät chieàu, teân maûng chính laø ñòa chæ cuûa phaàn töû ñaàu tieân cuûa maûng. Do ñoù, ta hoaøn toaøn coù theå truy xuaát maûng baèng moät pointer
  33. CHÖÔNG 12 POINTER 12.3 POINTER VAØ MAÛNG Ví duï: int a[3]; int (*p)[3]; p = &a ; Ví duï: Cho khai baùo sau: int a[10]; int *pa;
  34. CHÖÔNG 12 POINTER 12.3 POINTER VAØ MAÛNG *(a + 0) chính laø a[0], *(a + 1) chính laø a[1], *(a + i) chính laø a[i]. Coù theå gaùn: pa = a; hoaëc pa =&a[0];
  35. CHÖÔNG 12 POINTER 12.3 POINTER VAØ MAÛNG Khi ñoù, (pa + 0) seõ chæ ñeán phaàn töû a[0], (pa + 1) seõ chæ ñeán phaàn töû a[1], (pa + i) seõ chæ ñeán phaàn töû a[i]. Nhö vaäy, caùc ñoái töôïng *(pa + 0) chính laø *(a + 0), cuõng laø a[0] *(pa + 1) chính laø *(a + 1), cuõng laø a[1] *(pa + i) chính laø *(a + i), cuõng laø a[i]
  36. CHÖÔNG 12 POINTER 12.3 POINTER VAØ MAÛNG Coù theå truy suaát ñeán caùc ñoái töôïng cuûa maûng maø pointer ñang troû ñeán nhö sau: pa[0] chính laø phaàn töû a[0] pa[1] chính laø phaàn töû a[1] pa[i] chính laø phaàn töû a[i]. Ví duï 13.15 (SGT)
  37. CHÖÔNG 12 POINTER 12.3 POINTER VAØ MAÛNG Phaân bieät roõ raøng giöõa maûng vaø pointer. -Moät maûng, sau khi ñöôïc khai baùo vaø ñònh nghóa, ñaõ ñöôïc caáp moät vuøng nhôù trong boä nhôù trong cuûa maùy tính vaø ñòa chæ chính laø teân maûng. -Moät bieán pointer, sau khi ñöôïc khai baùo, thì vuøng nhôù ñöôïc caáp chæ laø baûn thaân bieán pointer, coøn trò beân trong noù laø moät ñòa chæ raùc. -Ngoaøi ra, bieán pointer coù moät ñòa chæ trong boä nhôù, coøn khoâng theå laáy ñòa chæ cuûa teân maûng.
  38. CHÖÔNG 12 POINTER 12.3 POINTER VAØ MAÛNG Ví duï: Sau khi khai baùo int a[10]; thì trong boä nhôù, a laø moät haèng pointer, hay moät ñòa chæ coá ñònh Caùc phaàn töû trong maûng ñang coù trò raùc. Vì teân maûng laø moät haèng pointer a++; laø khoâng hôïp leä.
  39. CHÖÔNG 12 POINTER 12.3 POINTER VAØ MAÛNG Ví duï: int *pa; thì trong boä nhôù do ñoù leänh gaùn *pa = 2; laø khoâng coù yù nghóa, duø C khoâng baùo loãi trong tröôøng hôïp naøy.
  40. CHÖÔNG 12 POINTER 12.3 POINTER VAØ MAÛNG Ví duï 13.18 vaø 13.19 (SGT)
  41. CHÖÔNG 12 POINTER 12.3 POINTER VAØ MAÛNG Töø maûng hai chieàu trôû ñi, vieäc duøng bieán pointer ñeå truy xuaát maûng laø khaù phöùc taïp, chuùng ta caàn phaûi luoân nhôù laø caùc thao taùc treân pointer luoân dieãn ra treân cuøng moät baäc quaûn lyù ñoái töôïng, nghóa laø chuùng ta phaûi luoân bieát pointer maø chuùng ta söû duïng ñang quaûn lyù ñoái töôïng kieåu naøo.
  42. CHÖÔNG 12 POINTER 12.3 POINTER VAØ MAÛNG Ví du:ï #define MAX_ROW 20 #define MAX_COL 30 int array[MAX_ROW][MAX_COL]; int row, col; /* hai bieán cho chæ soá haøng vaø chæ soá coät */ int (*parr) [MAX_ROW][MAX_COL]; /* biến con trỏ mảng hai chiều */ parr = &array; /* gaùn trị cho biến pointer mảng hai chiều */
  43. CHÖÔNG 12 POINTER 12.3 POINTER VAØ MAÛNG Vôùi khai baùo treân, danh hieäu array laø haèng pointer hai laàn pointer chæ tôùi phaàn töû ñaàu tieân cuûa maûng array, töùc ta coù array chính laø array[0][0]. Vôùi maûng hai chieàu, ta coù array[0] (= *array hay *(array + 0)) laø con troû chæ tôùi haøng 0 trong maûng (vaø dó nhieân array[row] laø con troû chæ tôùi haøng row trong maûng, ). Nhö vaäy, ta coù *array[0] chính laø array vaø cuõng chính laø array[0][0]. Theo quy định mảng một chiều, array[row] chính laø *(array+row), tức array[row] ≡ *(array+row).
  44. CHÖÔNG 12 POINTER 12.3 POINTER VAØ MAÛNG Khi ñoù, ta coù: array[row][col] ≡ *(array[row] + col), tức array[row][col] ≡ *( int (*) array + row*MAX_COL + col) array[row][col] ≡ *(*(array + row) + col) array[row][col] ≡ *(*( (int (*)[MAX_COL]) parr + row) + col) Ví duï: 13.24 (GT)
  45. CHÖÔNG 12 POINTER 12.4 ÑOÁI SOÁ CUÛA HAØM LAØ POINTER - TRUYEÀN ÑOÁI SOÁ THEO SOÁ DAÏNG THAM SOÁ BIEÁN Ví duï: #include #include void Swap (int doi_1, int doi_2); main() { int a = 3, b = 4; clrscr(); printf ("Tri cua hai bien a vaø b la: %d %d\n", a, b); Swap (a, b); printf("Sau khi goi ham Swap, tri cua a va b la: %d %d\n", a, b); getch();}
  46. CHÖÔNG 12 POINTER 12.4 ÑOÁI SOÁ CUÛA HAØM LAØ POINTER - TRUYEÀN ÑOÁI SOÁ THEO SOÁ DAÏNG THAM SOÁ BIEÁN Ví duï: void Swap (int doi_1, int doi_2) { int temp; temp = doi_1; doi_1 = doi_2; doi_2 = temp;} Chöông trình seõ cho xuaát lieäu ví duï: Tri cua hai bien a va b la: 3 4 Sau khi goi ham Swap, tri cua a va b la: 3 4
  47. CHÖÔNG 12 POINTER 12.4 ÑOÁI SOÁ CUÛA HAØM LAØ POINTER - TRUYEÀN ÑOÁI SOÁ THEO SOÁ DAÏNG THAM SOÁ BIEÁN Haøm Swap() coù theå vieát laïi nhö sau: void Swap (int *doi_1, int *doi_2) /*pointer laø ñoái soá cuûa haøm, ñeå nhaän ñòa chæ cuûa ñoái soá thaät*/ { int temp; temp = * doi_1; * doi_1 = * doi_2; * doi_2 = temp; }
  48. CHÖÔNG 12 POINTER 12.4 ÑOÁI SOÁ CUÛA HAØM LAØ POINTER - TRUYEÀN ÑOÁI SOÁ THEO SOÁ DAÏNG THAM SOÁ BIEÁN #include #include Hình thöùc void Swap (int *doi_1, int *doi_2); truyeàn ñoái main () soù haøm { int a = 3, b = 4; theo tham clrscr(); soá bieán printf ("Tri cua hai bien a va b la: %d %d\n", a, b); Swap (&a, &b); printf ("Sau khi goi ham Swap, tri cua a va b la: %d %d\n", a, b); getch(); }
  49. CHÖÔNG 12 POINTER 12.4 ÑOÁI SOÁ CUÛA HAØM LAØ POINTER - TRUYEÀN ÑOÁI SOÁ THEO SOÁ DAÏNG THAM SOÁ BIEÁN void Swap (int *doi_1, int *doi_2) { int temp; temp = * doi_1; * doi_1 = * doi_2; * doi_2 = temp; } Chöông trình seõ cho xuaát lieäu ví duï: Tri cua hai bien a vaø b la: 3 4 Sau khi goi ham Swap, tri cuûa a va b la: 4 3
  50. CHÖÔNG 12 POINTER 12.4 ÑOÁI SOÁ CUÛA HAØM LAØ POINTER - TRUYEÀN ÑOÁI SOÁ THEO SOÁ DAÏNG THAM SOÁ BIEÁN Caùc traïng thaùi cuûa stack thöïc thi ngay sau: (a) leänh temp = * doi_1;
  51. CHÖÔNG 12 POINTER 12.4 ÑOÁI SOÁ CUÛA HAØM LAØ POINTER - TRUYEÀN ÑOÁI SOÁ THEO SOÁ DAÏNG THAM SOÁ BIEÁN Caùc traïng thaùi cuûa stack thöïc thi ngay sau: (b) leänh * doi_1 = * doi_2; (c) leänh * doi_2 = temp;
  52. CHÖÔNG 12 POINTER 12.4 ÑOÁI SOÁ CUÛA HAØM LAØ POINTER - TRUYEÀN ÑOÁI SOÁ THEO SOÁ DAÏNG THAM SOÁ BIEÁN Trong thö vieän chuaån cuûa C cuõng coù nhieàu haøm nhaän ñoái soá vaøo theo ñòa chæ, ví duï haøm scanf(), nhaäp trò vaøo cho bieán töø baøn phím.
  53. CHÖÔNG 12 POINTER 12.4 ÑOÁI SOÁ CUÛA HAØM LAØ POINTER - TRUYEÀN ÑOÁI SOÁ THEO SOÁ DAÏNG THAM SOÁ BIEÁN Ví duï: #include #include main() { int n; clrscr(); printf("Moi nhap mot so nguyen "); scanf("%d", &n); printf("\n Binh phuong cua %d la %d\n", n, n*n); getch(); }
  54. CHÖÔNG 12 POINTER 12.5 HAØM TRAÛ VEÀ POINTER VAØ MAÛNG Moät pointer coù theå ñöôïc traû veà töø haøm, neáu pointer troû ñeán ñoái töôïng laø maûng, thì haøm traû veà maûng; neáu pointer chæ troû ñeán bieán bình thöôøng, thì haøm chæ traû veà con troû troû ñeán bieán thöôøng, cuù phaùp khai baùo haøm nhö sau: kieåu * teân_haøm (danh_saùch_khai_baùo_ñoái_soá); vôùi kieåu laø kieåu cuûa ñoái töôïng maø pointer ñöôïc haøm traû veà troû ñeán.
  55. CHÖÔNG 12 POINTER 12.5 HAØM TRAÛ VEÀ POINTER VAØ MAÛNG Ví duï: Coù khai baùo int * lon_nhat (int a, int b, int c); thì haøm lon_nhat() traû veà moät ñòa chæ, ñòa chæ ñoù coù theå laø ñòa chæ cuûa moät int hoaëc ñòa chæ cuûa moät maûng caùc int, vieäc söû duïng ñòa chæ theo ñoái töôïng naøo laø do nôi goïi.
  56. CHÖÔNG 12 POINTER 12.5 HAØM TRAÛ VEÀ POINTER VAØ MAÛNG Ví duï: Thieát keá haøm nhaäp trò cho maûng caùc int int *nhap_tri (int *num) { static int a[10]; int i, n; printf ("Nhap kich thuoc mang:"); scanf ("%d", &n); *num = n; printf ("Nhap tri cho %d phan tu cua mang:", n); for (i = 0; i < n; i++) scanf ("%d", &a[i]); return a; /* a laø ñòa chæ ñaàu maûng caàn traû veà */ }
  57. CHÖÔNG 12 POINTER 12.5 HAØM TRAÛ VEÀ POINTER VAØ MAÛNG Ví duï: Chöông trình söû duïng haøm nhaäp trò maûng #include #include int *nhap_tri(int *num); main() { int *pint, so_phan_tu, i; clrscr(); pint = nhap_tri (&so_phan_tu); printf ("Cac phan tu cua mang la:"); for (i =0; i <so_phan_tu; i++) printf ("%d", pint[i]); getch(); }
  58. CHÖÔNG 12 POINTER 12.6 CHUOÃI KYÙ TÖÏ Ví duï: Khi khai baùo “Hello, world!” thì chuoãi naøy seõ ñöôïc C ghi vaøo moät nôi naøo ñoù trong boä nhôù vaø coù ñòa chæ xaùc ñònh. Ñòa chæ naøy coù theå ñöôïc gaùn vaøo cho moät bieán con troû troû ñeán kyù töï ñeå quaûn lyù chuoãi. Ví duï : Cho khai baùo char s[20]; s = “Hello, world!”; Khoâng hôïp leä
  59. CHÖÔNG 12 POINTER 12.6 CHUOÃI KYÙ TÖÏ 1- Nhaäp trò chuoãi Vieäc nhaäp trò cho chuoãi bao goàm hai böôùc: ñaàu tieân caàn khai baùo moät nôi troáng ñeå chöùa chuoãi, sau ñoù duøng moät haøm nhaäp trò ñeå laáy chuoãi.
  60. CHÖÔNG 12 POINTER 12.6 CHUOÃI KYÙ TÖÏ 1- Nhaäp trò chuoãi - Haøm gets() ñoïc caùc kyù töï ñeán khi naøo gaëp kyù töï quy ñònh haøng môùi (töùc kyù töï '\n', töùc khi ta aán phím ENTER) thì keát thuùc vieäc nhaäp. Sau ñoù haøm naøy laáy taát caû caùc kyù töï ñaõ nhaäp tröôùc kyù töï '\n', gaén theâm vaøo cuoái chuoãi moät kyù töï NUL ('\0') vaø traû chuoãi cho chöông trình goïi. Prototype cuûa haøm naøy trong file stdio.h: char * gets (char * s);
  61. CHÖÔNG 12 POINTER 12.6 CHUOÃI KYÙ TÖÏ 1- Nhaäp trò chuoãi Ví duï: #include #include main() { char ten[41]; char *pten; clrscr(); printf ("Ban ten gi?\n"); pten = gets (ten); printf("%s? A! Chao ban %s\n", ten, pten); getch(); }
  62. CHÖÔNG 12 POINTER 12.6 CHUOÃI KYÙ TÖÏ 1- Nhaäp trò chuoãi - Haøm scanf() cuõng cho pheùp nhaäp chuoãi qua ñònh daïng nhaäp %s. Vieäc nhaäp chuoãi seõ keát thuùc khi haøm scanf() gaëp moät trong caùc kyù töï khoaûng traéng, kyù töï tab hay kyù töï xuoáng haøng ñaàu tieân maø noù gaëp. Ñaây chính laø ñieåm khaùc nhau giöõa hai haøm nhaäp chuoãi gets() vaø scanf().
  63. CHÖÔNG 12 POINTER 12.6 CHUOÃI KYÙ TÖÏ 1- Nhaäp trò chuoãi Ví duï: #include #include main() { char ten1[41], ten2[41]; clrscr(); printf(Moi ban nhap hai ten: ); scanf ("%s %s", ten1, ten2); printf("A! Chao hai ban %s va %s \n", ten1, ten2); getch(); }
  64. CHÖÔNG 12 POINTER 12.6 CHUOÃI KYÙ TÖÏ 2- Xuaát chuoãi Ñeå xuaát chuoãi, hai haøm thöôøng hay ñöôïc duøng laø puts() vaø printf(). - Haøm puts: ta chæ caàn cung caáp cho haøm ñoái soá laø ñòa chæ cuûa chuoãi caàn in. Haøm naøy seõ ñoïc töøng kyù töï cuûa chuoãi vaø in ra maøn hình cho ñeán khi gaëp kyù töï NUL thì in ra maøn hình theâm moät kyù töï xuoáng haøng nöõa. Prototype cuûa haøm naøy nhö sau: int puts (char * s);
  65. CHÖÔNG 12 POINTER 12.6 CHUOÃI KYÙ TÖÏ 2- Xuaát chuoãi - Haøm printf () cuõng cho pheùp xuaát chuoãi ra maøn hình neáu ta duøng ñònh daïng xuaát "%s" cho noù. Haøm naøy seõ khoâng töï ñoäng in theâm kyù töï xuoáng haøng môùi nhö haøm puts().
  66. CHÖÔNG 12 POINTER 12.6 CHUOÃI KYÙ TÖÏ 2- Xuaát chuoãi Ví duï: #include #include main() { char ten[41]; clrscr(); printf ("Moi ban nhap ten: "); gets(ten); printf ("A! Chao ban: %s", ten); getch(); }
  67. CHÖÔNG 12 POINTER 12.6 CHUOÃI KYÙ TÖÏ 3- Gaùn trò cho chuoãi Vieäc gaùn trò cho bieán chuoãi thöïc teá laø vieäc cheùp töøng kyù töï töø haèng chuoãi hoaëc bieán chuoãi ñaõ bieát sang moät bieán chuoãi khaùc. Trong C, thao taùc naøy ñöôïc thöïc hieän nhôø haøm strcpy(), haøm naøy coù prototype trong file string.h nhö sau: char *strcpy(char *dest, const char *src);
  68. CHÖÔNG 12 POINTER 12.6 CHUOÃI KYÙ TÖÏ 3- Gaùn trò cho chuoãi Haøm strcpy coù theå ñöôïc moâ taû nhö sau: char *strcpy(char *dest, const char *src) { int i; for (i = 0; (dest[i] = scr[i]) != '\0'; i++) ; return dest; }
  69. CHÖÔNG 12 POINTER 12.6 CHUOÃI KYÙ TÖÏ 3- Gaùn trò cho chuoãi Ví duï: #include #include #include main() { char ten1[41], ten2[41]; clrscr(); printf("Moi ban nhap ten: "); gets(ten1); strcpy (ten2, ten1); printf("A! Chao ban: %s", ten2); getch(); }
  70. CHÖÔNG 12 POINTER 12.6 CHUOÃI KYÙ TÖÏ 4- Laáy chieàu daøi chuoãi Trong C, ñeå laáy chieàu daøi chuoãi ta duøng haøm strlen(). Prototype cuûa haøm naøy trong file string.h: size_t strlen(const char *s); vôùi size_t laø moät kieåu nguyeân, C quy ñònh ñaây laø unsigned.
  71. CHÖÔNG 12 POINTER 12.6 CHUOÃI KYÙ TÖÏ 4- Laáy chieàu daøi chuoãi Ví duï:Xeùt chöông trình nhaäp moät chuoãi, ñoåi caùc kyù töï thöôøng cuûa chuoãi ñoù thaønh kyù töï hoa, in chuoãi ñoù ra laïi maøn hình.
  72. CHÖÔNG 12 POINTER 12.6 CHUOÃI KYÙ TÖÏ 4- Laáy chieàu daøi chuoãi #include #include #include main() { char ten[41]; int i; clrscr(); printf("Moi ban nhap ten: "); gets(ten); for ( i = 0; i = 'a' && ten[i] <= 'z') ten[i] -= 32; printf ("A! Chao ban: %s", ten); getch();}
  73. CHÖÔNG 12 POINTER 12.6 CHUOÃI KYÙ TÖÏ 5- Noái chuoãi Ñeå noái hai chuoãi laïi, C coù haøm chuaån strcat(). Haøm naøy nhaän hai chuoãi laøm ñoái soá, vaø moät baûn sao cuûa chuoãi thöù hai seõ ñöôïc cheùp noái vaøo cuoái cuûa chuoãi thöù nhaát, ñeå taïo ra chuoãi môùi. Chuoãi thöù hai vaãn khoâng coù gì thay ñoåi. Prototype cuûa haøm naøy trong file string.h: char *strcat(char *dest, const char *src); Ví duï 13.37(SGT)
  74. CHÖÔNG 12 POINTER 12.6 CHUOÃI KYÙ TÖÏ 6- So saùnh chuoãi Haøm naøy laø strcmp(), coù prototype trong file string.h: int strcmp(const char *s1, const char*s2); Haøm naøy so saùnh hai chuoãi s1 vaø s2 vaø traû veà moät trò laø: - soá döông neáu s1 > s2 - soá aâm neáu s1 < s2 - soá 0 neáu s1 == s2
  75. CHÖÔNG 12 POINTER 12.6 CHUOÃI KYÙ TÖÏ 6- So saùnh chuoãi Ví duï:Xeùt chöông trình ví duï sau ñaây #include #include #include main() { clrscr(); printf("%d \n", strcmp("QUAN", “quan”)); printf("%d \n', strcmp("QUAN", "QUAN")); printf("%d \n", strcmp("quan", "QUAN")); printf("%d \n", strcmp("quang”, “quanG")); printf("%d \n", strcmp("quang”, “quan")); getch(); }
  76. CHÖÔNG 12 POINTER 12.6 CHUOÃI KYÙ TÖÏ 6- So saùnh chuoãi Chöông trình cho xuaát lieäu: -32 0 32 32 103
  77. CHÖÔNG 12 POINTER 12.7 POINTER VAØ VIEÄC ÑÒNH VÒ BOÄ NHÔÙ ÑOÄNG C cho pheùp khai baùo caùc bieán ñoäng, caùc bieán naøy khi caàn thì xin choã, khoâng caàn thì giaûi phoùng vuøng nhôù cho chöông trình söû duïng vaøo muïc ñích khaùc. Caùc bieán ñoäng naøy ñöôïc caáp phaùt trong vuøng nhôù heap, laø vuøng ñaùy boä nhôù (vuøng coøn laïi sau khi ñaõ naïp caùc chöông trình khaùc xong), vaø ñöôïc quaûn lyù bôûi caùc bieán pointer
  78. CHÖÔNG 12 POINTER 12.7 POINTER VAØ VIEÄC ÑÒNH VÒ BOÄ NHÔÙ ÑOÄNG Trong C coù hai haøm chuaån ñeå xin caáp phaùt boä nhôù ñoäng malloc() vaø calloc(), caû hai haøm ñeàu coù prototype naèm trong file alloc.h hoaëc stdlib.h nhö sau: void *malloc(size_t size); void *calloc(size_t nitems, size_t size);
  79. CHÖÔNG 12 POINTER 12.7 POINTER VAØ VIEÄC ÑÒNH VÒ BOÄ NHÔÙ ÑOÄNG Neáu bieán ñoäng ñöôïc xin, sau khi duøng xong, vuøng nhôù cuûa noù khoâng ñöôïc giaûi phoùng thì noù vaãn chieám choå trong boä nhôù, maëc duø chöông trình ñaõ keát thuùc. C ñöa ra haøm free() ñeå giaûi phoùng khoái boä nhôù ñöôïc xin baèng haøm malloc() hoaëc calloc(). Prototype cuûa haøm free() trong file stdlib.h hoaëc alloc.h nhö sau: void free (void * block);
  80. CHÖÔNG 12 POINTER 12.7 POINTER VAØ VIEÄC ÑÒNH VÒ BOÄ NHÔÙ ÑOÄNG Cấu truùc bộ nhớ LC-3 với öùng bộ nhớ heap
  81. CHÖÔNG 12 POINTER 12.7 POINTER VAØ VIEÄC ÑÒNH VÒ BOÄ NHÔÙ ÑOÄNG Ví duï: Caàn xin moät khoái boä nhôù coù 10 phaàn töû int, ta vieát nhö sau: int *pint; pint = (int *) malloc (10 * siezof (int)); hoaëc pint = (int *) calloc (10, siezof (int));
  82. CHÖÔNG 12 POINTER 12.7 POINTER VAØ VIEÄC ÑÒNH VÒ BOÄ NHÔÙ ÑOÄNG Ví duï: #include #include #include  EXIT #include main() { int *pint, s = 0, i; pint = (int *) calloc (10, sizeof (int)); if (pint == NULL) { printf ("Khong du bo nho \n"); exit (1); }
  83. CHÖÔNG 12 POINTER 12.7 POINTER VAØ VIEÄC ÑÒNH VÒ BOÄ NHÔÙ ÑOÄNG Ví duï: clrscr(); printf ("Moi nhap 10 tri vao mang: "); for (i = 0; i <10; i++) scanf ("%d", &pint[i]); for (i = 0; i <10; i++) s += pint[i]; printf ("Tong cac phan tu cua mang la: %d \n", s); getch(); free (pint); }
  84. CHÖÔNG 12 POINTER 12.8 MAÛNG CAÙC POINTER Cuù phaùp khai baùo maûng caùc pointer: kieåu * teân_maûng [Kích_thöôùc]; Ví duï: Khi khai baùo int * pint[4];
  85. CHÖÔNG 12 POINTER 12.8 MAÛNG CAÙC POINTER Ví duï: Khi khai baùo int * pint[4]; int a = 2, b = 3, c = 4, d = 5; pint[0] = &a; pint[1] = &b; pint[2] = &c; pint[3] = &d;
  86. CHÖÔNG 12 POINTER 12.8 MAÛNG CAÙC POINTER
  87. CHÖÔNG 12 POINTER 12.8 MAÛNG CAÙC POINTER Ví duï: Khi khai baùo int * pint[4]; int a[3], b[3], c[3], d[3]; pint[0] = a; pint[1] = b; pint[2] = c; pint[3] = d;
  88. CHÖÔNG 12 POINTER 12.8 MAÛNG CAÙC POINTER
  89. CHÖÔNG 12 POINTER 12.8 MAÛNG CAÙC POINTER Ví duï 13.48, 13.49 (SGT) Ví duï : Khi khai baùo int a[4][5]; int *b[4]; thì khi truy xuaát a[2][3] vaø b[2][3], C ñeàu hieåu ñaây laø caùc bieán int
  90. CHÖÔNG 12 POINTER 12.8 MAÛNG CAÙC POINTER Moät maûng caùc pointer cuõng coù theå ñöôïc khôûi ñoäng trò neáu maûng laø maûng toaøn cuïc hay maûng tónh. Ví duï: static char *thu[7] = {"Thu 2", "Thu 3", "Thu 4", "Thu 5", "Thu 6", "Thu 7", "Chua nhat"};
  91. CHÖÔNG 12 POINTER 12.9 POINTER CUÛA POINTER Cuù phaùp khai baùo pointer naøy nhö sau: kieåu teân_pointer Ví duï: int pint; int*p; int a[4][4]; thì pint = &p; hoaëc pint = (int ) &a;
  92. CHÖÔNG 12 POINTER 12.9 POINTER CUÛA POINTER Thay vì truy xuaát a[i][j], ta coù theå truy xuaát *(pint + m*i + j), vôùi m laø soá phaàn töû treân moät haøng cuûa maûng hai chieàu.
  93. CHÖÔNG 12 POINTER 12.9 POINTER CUÛA POINTER Ví duï: #include #define MAX_ROW 3 #define MAX_COL 3 main() { int row, col; int *pint1; int a2d [MAX_ROW][MAX_COL] = { {0, 1, 2}, {10, 11, 12}, {20, 21, 22} };
  94. CHÖÔNG 12 POINTER 12.9 POINTER CUÛA POINTER int pint2; int (*pa2d)[MAX_ROW][MAX_COL]; /* Thu dia chi cua pointer va mang 2 chieu */ pint1 = a2d[1]; pa2d = &a2d; pint2 = (int )&a2d; printf ("pint1 = a2d[1] = %p\n", pint1); printf ("*( *( ( int (*)[MAX_COL] ) pint2 + 1)+ 2)= %d\n", *( *( ( int (*)[MAX_COL] ) pint2 + 1)+ 2)); printf ("*( *(a2d + 1) + 2) = %d\n", *( *(a2d + 1) + 2));
  95. CHÖÔNG 12 POINTER 12.9 POINTER CUÛA POINTER printf ("*pint1[2] = %d\n", pint1[2]); printf ("(*pa2d)[1][2] = %d\n", (*pa2d)[1][2]); printf ("Tri cua cac phan tu trong mang truy xuat qua pointer 2 lan:\n"); for (row = 0; row < MAX_ROW; row ++) { for (col = 0; col < MAX_COL; col ++) printf ("%d ", *( *( ( int (*)[MAX_COL] ) pint2 + row)+ col)); printf ("\n"); } getchar();}
  96. CHÖÔNG 12 POINTER 12.9 POINTER CUÛA POINTER
  97. CHÖÔNG 12 POINTER 12.9 POINTER CUÛA POINTER Ví duï : int *m[4]; int a = 1, b = 2, c = 3, d = 4; int pint; pint = m; m[0] = &a; m[1] = &b; m[2] = &c; m[3] = &d; Thay vì truy xuaát tröïc tieáp a, b, , ta coù theå duøng pointer *(pint[i])
  98. CHÖÔNG 12 POINTER 12.9 POINTER CUÛA POINTER Ví duï: Xeùt khai baùo sau: int pi; int * pint[4]; int a[3], b[3], c[3], d[3]; pi = pint; pint[0] = a; pint[1] = b; pint[2] = c; pint[3] = d;
  99. CHÖÔNG 12 POINTER 12.9 POINTER CUÛA POINTER
  100. CHÖÔNG 12 POINTER 12.9 POINTER CUÛA POINTER Ví duï 13.56(GT)
  101. CHÖÔNG 12 POINTER 12.10 ÑOÁI SOÁ CUÛA HAØM MAIN C hoaøn toaøn cho pheùp vieäc nhaän ñoái soá vaøo haøm main(), coù hai ñoái soá C ñaõ quy ñònh theo thöù töï: int agrc: ñoái soá cho bieát soá tham soá ñaõ nhaäp, keå caû teân chöông trình. char *argv[]: maûng caùc pointer troû ñeán caùc chuoãi laø tham soá ñi theo sau teân chöông trình khi chaïy chöông trình töø DOS.
  102. CHÖÔNG 12 POINTER 12.10 ÑOÁI SOÁ CUÛA HAØM MAIN Ví duï: Xeùt chöông trình ví duï sau: #include #include main (int argc, char *argv[]) { int i; clrscr(); printf ("Cac doi so cua chuong trinh la: \n"); printf ("Ten chuong trinh la: %s \n", argv[0]); if ( argc >1 ) for (i = 1; i < argc; i++) printf ("Doi so thu %d: %s \n", i, argv[i]); getch(); }
  103. CHÖÔNG 12 POINTER 12.10 ÑOÁI SOÁ CUÛA HAØM MAIN Neáu nhaäp töø baøn phím nhö sau C:\>thu_main tin thu 123 thì chöông trình cho xuaát lieäu laø: Cac doi so cua chuong trinh la: Ten chuong trinh la: C:\thu_main.exe Doi so thu 1: tinDoi so thu 2: thu Doi so thu 3: 123 Ví duï 13.59(GT)
  104. CHÖÔNG 12 POINTER 12.11 POINTER TROÛ ÑEÁN HAØM Cuù phaùp khai baùo moät pointer chæ tôùi haøm: kieåu (* teân_pointer) (kieåu_caùc_ñoái_soá); Chuù yù: kieåu * teân_haøm (kieåu_caùc_ñoái_soá); Haøm traû veà pointer
  105. CHÖÔNG 12 POINTER 12.11 POINTER TROÛ ÑEÁN HAØM Ví duï: Neáu khai baùo int (* p_function) (int, int); vaø ñaõ coù haøm int cong (int a, int b) { } Ta coù theå: p_function = cong; tong = (*p_function) (m, n);
  106. CHÖÔNG 12 POINTER 12.11 POINTER TROÛ ÑEÁN HAØM Ví duï 13.62 (GT)
  107. CHÖÔNG 12 POINTER 12.12 ÖÙNG DUÏNG 12.12.1 Danh saùch lieân keát laø stack 12.12.2 Danh saùch lieân keát laø queue (GT)
  108. CHÖÔNG 12 POINTER 12.12 ÖÙNG DUÏNG BAØI TAÄP CUOÁI CHÖÔNG 1. Vieát chöông trình vôùi moät haøm cho pheùp truy xuaát chuoãi trong stack (danh saùch lieân keát vaø maûng) vaø in ra maøn hình thoâng tin theo thöù töï alphabet. 2. Duøng caáu truùc döõ lieäu queue daïng danh saùch lieân keát, tính bieåu thöùc daïng ña thöùc baát kyø sau: n m 3 f(x) = ao x a 1 x a n 1 x a n trong phaàn thoâng tin coù hai vuøng bieán - heä soá - soá muõ
  109. CHÖÔNG 12 POINTER 12.12 ÖÙNG DUÏNG BAØI TAÄP CUOÁI CHÖÔNG 3. Vieát chöông trình vôùi moät haøm duyeät toaøn boä caùc phaàn töû trong queue, traû veà soá phaàn töû trong queue. 4. Vieát chöông trình taïo moät danh saùch lieân keát löu caùc thoâng tin laø caùc soá nguyeân theo thöù töï töø lôùn tôùi nhoû. Thieát keá haøm insert() cho pheùp cheøn moät phaàn töû löu thoâng tin soá vaøo vò trí coù thöù töï phuø hôïp trong chuoãi. 5. Viết chương trình nhập vaøo một số số nguyeân (chưa biết coù bao nhieâu số nguyeân). Loại bỏ caùcsố nguyeân bị lặp lại. In ra daõy số mới naøy. Ví dụ: Nhập: 5 4 10 8 5 4 10 2 8 In ra: 5 4 10 8 2
  110. CHÖÔNG 12 POINTER KEÁT THUÙC CHÖÔNG 12