pointers pointer operations c
Intenzívna štúdia ukazovateľov a ich použitia v C ++.
Ukazovateľ je jednou z najsilnejších funkcií jazyka C ++. Ukazovateľ pomáha manipulovať s premennými prostredníctvom svojej adresy.
ako urobiť súbory .jar otvorené pomocou Java
V tomto výučbe podrobne preskúmame všetky ukazovatele a ich použitie v jazyku C ++.
=> Dajte si pozor na jednoduchú sériu školení C ++ tu.
Čo sa dozviete:
- Čo je to ukazovateľ?
- Ukazovateľ aritmetický
- Ukazovatele neplatnosti a neplatnosti
- Polia a ukazovatele
- Pole ukazovateľov
- Ukazovateľ ukazovateľov
- Prenášanie ukazovateľov na funkcie
- Ukazovatele funkcií
- Záver
- Odporúčané čítanie
Čo je to ukazovateľ?
Ukazovateľ je premenná, ktorá obsahuje adresu pamäťového miesta. Vieme, že všetky premenné, ktoré deklarujeme, majú v pamäti konkrétnu adresu. Deklarujeme premennú ukazovateľa, ktorá smeruje na tieto adresy v pamäti.
Všeobecná syntax pre deklarovanie premennej ukazovateľa je:
datatype * variable_name;
Napríklad, vyhlásenie int * ptr;
To znamená, že ptr je ukazovateľ, ktorý smeruje na premennú typu int. Premenná ukazovateľa preto vždy obsahuje miesto v pamäti alebo adresu. Pozrime sa ďalej na prácu s premennými ukazovateľa.
Zvážte, že máme nasledujúce vyhlásenia:
Int p, *ptr; //declare variable p and pointer variable ptr p = 4; //assign value 4 to variable p ptr = &p; //assign address of p to pointer variable ptr
V pamäti budú tieto vyhlásenia zobrazené takto:
Toto je interná reprezentácia ukazovateľa v pamäti. Keď priradíme premennú adresa k premennej pointer, ukazuje na premennú, ako je to znázornené na obrázku vyššie.
Pretože ptr má adresu premennej p, * ptr dá hodnotu premennej p (premenná, na ktorú ukazuje ukazovateľová premenná ptr).
Poznámka: Operátor *, ktorý používame s ukazovateľom, sa používa na označenie, že ide o ukazovateľovú premennú.
Pozrime sa na niektoré koncepty ukazovateľov, ktoré sa používajú v C ++.
Ukazovateľ aritmetický
Vieme, že premenná ukazovateľa vždy smeruje na adresu v pamäti. Medzi operáciami, ktoré môžeme vykonať, máme nasledujúce aritmetické operácie, ktoré sa vykonávajú na ukazovateľoch.
- Operátor prírastku (++)
- Operátor zníženia (-)
- Sčítanie (+)
- Odčítanie (-)
Pozrime sa na použitie týchto operácií v ukážkovom programe.
#include #include using namespace std; int main() { int myarray[5] = {2, 4,6, 8,10}; int* myptr; myptr = myarray; cout<<'First element in the array :'<<*myptr< Výkon:
Prvý prvok v poli: 2
ďalší prvok v poli: 4
ďalší prvok v poli: 6
ďalší prvok v poli: 4
ďalší prvok v poli: 2
Videli sme aritmetické operácie vykonané na ukazovateľoch. Upozorňujeme, že operátor prírastku ++ zvyšuje ukazovateľ a ukazuje na ďalší prvok v poli. Podobne operátor dekrementácie dekrementuje premennú ukazovateľa o 1 tak, aby smerovala na predchádzajúci prvok v poli.
Používame tiež operátory + a -. Najskôr sme do premennej ukazovateľa pridali 1. Výsledok ukazuje, že smeruje na ďalší prvok v poli. Podobne, - operátor vytvorí premennú ukazovateľa tak, aby ukazovala na predchádzajúci prvok v poli.
Okrem týchto aritmetických operátorov môžeme použiť aj operátory porovnania ako ==,.
Ukazovatele neplatnosti a neplatnosti
Ak v prípade, ak ukazovateľovej premennej nie je priradená adresa premennej, je dobrým zvykom priradiť ukazovateľovej hodnote hodnotu NULL. Premenná ukazovateľa s hodnotou NULL sa nazýva ukazovateľ NULL.
Nulový ukazovateľ je konštantný ukazovateľ s hodnotou nula definovanou v záhlaví iostream. Pamäť na adrese 0 je rezervovaná operačným systémom a do tohto umiestnenia nemáme prístup.
Pomocou nulového ukazovateľa môžeme zabrániť zneužitiu nepoužitých ukazovateľov a zabrániť premenným ukazovateľom, aby im mali priradené nejaké hodnoty smetí.
Ukazovatele neplatnosti sú špeciálne ukazovatele, ktoré smerujú na hodnoty bez typu. Ukazovatele neplatnosti sú flexibilnejšie, pretože môžu ukazovať na akýkoľvek typ. Nemožno ich však priamo dereferencovať. Pre dereferenciu je potrebné ukazovateľ void previesť na ukazovateľ, ktorý ukazuje na hodnotu s konkrétnym dátovým typom.
Ukázali sme prácu ukazovateľa NULL a ukazovateľa void v nasledujúcom príklade kódu.
#include #include using namespace std; int main() { int intvar = 10; char c = 'A'; void* vptr; int* myptr = NULL; cout<<'NULL pointer value :'< Výkon:
Hodnota ukazovateľa NULL: 0
Void pointer vptr ukazuje na: A
Void pointer vptr poukazuje na: 10
Vo vyššie uvedenom programe najskôr deklarujeme celočíselný ukazovateľ, ktorému je priradená hodnota NULL. Keď tlačíme tento ukazovateľ, vidíme, že hodnota je 0, ako sme už diskutovali.
Ďalej vyhlásime ukazovateľ neplatnosti. Najskôr priradíme tomuto znaku neplatnosti adresu premennej znaku. Potom priradíme ukazovateľ void k ukazovateli znakov a obsadíme ho znakom char *. Ďalej vytlačíme hodnotu charptr, ktorá ukazuje na char A, čo bola znaková premenná, ktorú sme deklarovali skôr a na ktorú ukazuje ukazovateľ void.
Ďalej sme ukazovateľovi prázdnoty priradili celočíselnú premennú a potom vykonáme rovnaké kroky dereferencie tohto ukazovateľa prázdnosti pomocou celočíselného ukazovateľa.
Polia a ukazovatele
Polia a ukazovatele sú navzájom silne spojené. Vieme, že názov poľa smeruje na prvý prvok v poli a ide o konštantný ukazovateľ.
Tento ukazovateľ môžeme priradiť k premennej ukazovateľa a potom pristupovať k poli buď znížením ukazovateľa, alebo pomocou operátora dolného indexu.
Toto priradenie medzi premennou ukazovateľa a poľom uvidíme v nasledujúcom príklade kódu.
#include #include using namespace std; int main() { int myarray[5] = {1, 1, 2, 3, 5}; int* ptrvar; ptrvar = myarray; for(int i=0;i<5;i++) { cout<<*ptrvar<<' '; ptrvar++; } return 0; }
Výkon:
1 1 2 3 5
Vo vyššie uvedenom programe priradíme názov poľa premennej ukazovateľ. Keď názov poľa ukazuje na prvý prvok v poli, môžeme vytlačiť obsah celého poľa pomocou premennej ukazovateľa a zvýšiť ho pomocou operátora ++. Toto sa zobrazuje na výstupe.
ako opraviť nedefinovaný odkaz v c ++
Pole ukazovateľov
Niekedy v programe potrebujeme viac ako jednu ukazovateľovú premennú. Namiesto toho, aby sme deklarovali každú jednotlivú premennú ukazovateľa, môžeme deklarovať pole ukazovateľov.
Hneď si vezmime príklad, ktorý demonštruje množstvo ukazovateľov.
#include #include using namespace std; int main() { int myarray[5] = {2,4,6,8,10}; int *ptr[5]; //array of pointers for(int i=0;i<5;i++){ ptr[i] = &myarray[i]; } for (int i = 0; i < 5; i++) { cout << 'Value of myarray[' << i << '] = '; cout << *ptr[i] << endl; } return 0; }
Výkon:
Hodnota myarray [0] = 2
Hodnota myarray [1] = 4
Hodnota myarray [2] = 6
Hodnota myarray [3] = 8
Hodnota myarray [4] = 10
Vo vyššie uvedenom vyhlásení
int * ptr [5];
Môžeme interpretovať ako; ptr je pole 5 celočíselných ukazovateľov. Preto každý prvok ptr bude ukazovať na premennú typu integer.
Využívame celočíselné pole a každému z prvkov ptr priradíme adresu každého prvku poľa. Potom zobrazíme obsah poľa ptr výstupom „* ptr [i]“.
Ukazovateľ ukazovateľov
Ukazovateľ ukazovateľov nie je nič iné ako viacnásobné indície. Je to akýsi reťazec ukazovateľov. Keď definujeme ukazovateľ ukazovateľov, prvý ukazovateľ má adresu druhého ukazovateľa, ktorý má zase adresu premennej, na ktorú ukazuje.
V pamäti to bude reprezentované ako:

Ukazovateľ ukazovateľov je vyhlásený takto:
int** intptr;
Priamo si vezmeme príklad kódu, aby sme lepšie pochopili ukazovateľ ukazovateľov.
#include #include using namespace std; int main() { int *vptr; int ** intptr; int var = 10; vptr = &var; intptr = &vptr; cout<<'Variable var: '< Výkon:
Premenná var: 10
Ukazovateľ na premennú: 10
Ukazovateľ na ukazovateľ na premennú: 10
Vo vyššie uvedenom programe deklarujeme celočíselnú premennú, celočíselný ukazovateľ a smerník ukazovateľa na celé číslo. Ako je uvedené v programe, premennej pointer je priradená hodnota premennej. Ukazovateľu premennej ukazovateľ je priradená adresa ukazovateľa ukazovateľa.
Na záver vytlačíme tri premenné, ktoré zobrazujú rovnakú hodnotu 10, ktorá sa rovná celočíselnej premennej.
Prenášanie ukazovateľov na funkcie
Predávanie ukazovateľov na funkciu je rovnaké ako iné techniky odovzdávania parametrov, pri ktorých do funkcie odovzdávame ukazovatele ukazovateľa.
Znovu navštívime naše zamieňanie dvoch hodnôt a upravíme ich tak, aby ako parametre odovzdávali premenné ukazovateľa.
#include #include using namespace std; void swap(int* a, int* b) { int temp; temp = *a; *a = *b; *b = temp; } int main() { int a, b; cout<>a>>b; cout<<'a = '< Výkon:
Zadajte hodnoty, ktoré sa majú zameniť: 3 2
a = 3 b = 2
Zamieňané hodnoty
a = 2 b = 3
Ako je uvedené v programe, hodnoty, ktoré sa majú zameniť, odovzdáme ako celočíselné premenné. Formálne parametre sú definované ako ukazovateľové premenné. V dôsledku toho sa zmeny vykonané v premenných vo vnútri funkcií prejavia aj vo volajúcej funkcii.
Ukazovatele funkcií
rovnakým spôsobom, keďže máme ukazovatele na premenné, polia atď., môžeme mať aj ukazovatele na funkcie. Rozdiel je však v tom, že ukazovateľ funkcie ukazuje na spustiteľný kód, a nie na údaje, ako sú premenné alebo polia.
Berieme príklad na demonštráciu ukazovateľov funkcií.
#include #include using namespace std; void displayVal(int a) { printf('Value of a is %d
', a); } int main() { void (*func_ptr)(int) = &displayVal; (*func_ptr)(100); return 0; }
Výkon:
Hodnota a je 100
ako zobraziť xml súbory v
Vo vyššie uvedenom programe máme funkciu ‘displayVal’, ktorá iba vypíše celočíselnú hodnotu, ktorá je jej odovzdaná. V hlavnej funkcii sme definovali funkčný ukazovateľ „func_ptr“, ktorý berie int ako argument a vráti neplatný typ.
void (* func_ptr) (int)
Poznámka: Musíme vložiť ukazovateľ funkcie dovnútra (). Ak to vynecháme, stane sa funkčným prototypom.
Tomuto ukazovateli funkcie sme priradili adresu funkcie ‘displayVal’. Potom pomocou tohto ukazovateľa funkcie „func_ptr“ odovzdáme hodnotu argumentu 100, ktorá je ekvivalentná volaniu parametra displayVal s argumentom 100.
Teraz, ak máme inú funkciu s rovnakým prototypom, môžeme použiť rovnaký ukazovateľ funkcie tak, že mu priradíme adresu funkcie. Toto je hlavné použitie ukazovateľov funkcií.
Záver
Toto je všetko o ukazovateľoch, ich definíciách a použitiach v C ++.
V našom ďalšom tutoriáli sa dozvieme viac o referenciách v C ++. Odkazy majú špeciálne použitie v jazyku C ++ a často sa používajú ako aliasy pre premenné.
=> Kliknutím sem zobrazíte sériu školení Absolute C ++.
Odporúčané čítanie