CHÖÔNG 12 POINTER CHÖÔNG 12 POINTER 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öï 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æ. 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.
CHÖÔNG 12 POINTER 12.1 KHAÙI NIEÄM Ví duï 13.1: Chöông trình ñoåi trò #include<stdio.h> 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”);} 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. 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 ; 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 CHÖÔNG 12 POINTER 12.2 THAO TAÙC TREÂN POINTER 12.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.
CHÖÔNG 12 POINTER 12.2 THAO TAÙC TREÂN POINTER 12.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. CHÖÔNG 12 POINTER 12.2 THAO TAÙC TREÂN POINTER 12.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ä. CHÖÔNG 12 POINTER 12.2 THAO TAÙC TREÂN POINTER 12.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û CHÖÔNG 12 POINTER 12.2 THAO TAÙC TREÂN POINTER 12.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; CHÖÔNG 12 POINTER 12.2 THAO TAÙC TREÂN POINTER 12.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 CHÖÔNG 12 POINTER 12.2 THAO TAÙC TREÂN POINTER 12.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: CHÖÔNG 12 POINTER CHÖÔNG 12 POINTER CHÖÔNG 12 POINTER 12.2 THAO TAÙC TREÂN POINTER 12.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) -- ; CHÖÔNG 12 POINTER 12.2 THAO TAÙC TREÂN POINTER 12.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; CHÖÔNG 12 POINTER 12.2 THAO TAÙC TREÂN POINTER 12.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] */ CHÖÔNG 12 POINTER 12.2 THAO TAÙC TREÂN POINTER 12.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ù. CHÖÔNG 12 POINTER 12.2 THAO TAÙC TREÂN POINTER 12.2 Caùc pheùp toaùn treân pointer Ví duï: Xeùt chöông trình ví duï sau: #include <stdio.h> main() { int *p1, *p2; int a[10]; clrscr(); p1 = &a[0]; CHÖÔNG 12 POINTER 12.2 THAO TAÙC TREÂN POINTER 12.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(); } CHÖÔNG 12 POINTER 12.2 THAO TAÙC TREÂN POINTER 12.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 CHÖÔNG 12 POINTER 12.2 THAO TAÙC TREÂN POINTER 12.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 */ } CHÖÔNG 12 POINTER 12.2 THAO TAÙC TREÂN POINTER 12.2 Caùc pheùp toaùn treân pointer Ví duï: #include <stdio.h> main() { int *pint, a = 0 6141; char *pchar; clrscr(); pint = &a; pchar = (char *) &a; CHÖÔNG 12 POINTER 12.2 THAO TAÙC TREÂN POINTER 12.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(); } CHÖÔNG 12 POINTER 12.2 THAO TAÙC TREÂN POINTER 12.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 CHÖÔNG 12 POINTER 12.2 THAO TAÙC TREÂN POINTER 12.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.
CHÖÔNG 12 POINTER 12.2 THAO TAÙC TREÂN POINTER 12.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"; CHÖÔNG 12 POINTER 12.2 THAO TAÙC TREÂN POINTER 12.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"; CHÖÔNG 12 POINTER 12.2 THAO TAÙC TREÂN POINTER 12.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 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 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; CHÖÔNG 12 POINTER 12.3 POINTER VAØ MAÛNG *(a + 0) chính laø a[0], *(a + 1) chính laø a[1],. Coù theå gaùn: pa = a; hoaëc pa =&a[0]; 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],.
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] CHÖÔNG 12 POINTER 12.3 POINTER VAØ MAÛNG Coù theå truy xuaá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] .15 (SGT) 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. 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ä. 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.
CHÖÔNG 12 POINTER 12.3 POINTER VAØ MAÛNG Ví duï 13.19 (SGT) CHÖÔNG 12 POINTER 12.