Prejdi na obsah

Ukazovatele

Dnes si povieme niečo o ukazovateľoch a deklarácii pamäti pomocou kľúčového slova new.

Ukazovateľ

Ukazovateľ je jednoducho povedané premenná, v ktorej je uložená adresa pamäte. Aby ste plne pochopili o čo ide, musíme si povedať niečo o pamäti. Každá premenná je uložená v pamäti RAM. Miesto, kde ja tato premenná uložená je označene adresou. Práve táto adresa je uložená v ukazovateli. Ukazovatele sú silným nástrojom jazyka C++, pretože umožňujú priamu manipuláciu s pamäťou. Plnú silu tohto nastroja pochopíte až neskôr.

Operátor adresy a nepriameho prístupu a deklarácia ukazovateľa

Aby sme museli uložiť do ukazovateľa adresu, musíme ju najprv poznať. Adresu premennej v pamäti zistime pomocou operátora adresy: &. Aby sme sa dostali k hodnote uloženej na adrese v ukazovateli potrebujeme operátor nepriameho prístupu (alebo tiež dereferencie): *. Deklarácia ukazovateľa vyzerá: typ premennej, na ktorú ukazovateľ ukazuje *(hviezdička) názov ukazovateľa.

V nasledujúcom príklade si ukážeme, ako to všetko vyzerá:

  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. int main(int argc, char *argv[])
  6. { long premenna = 5;
  7. long * ukazovatel = &premenna;
  8. cout<<"adresa premennej je: "<<&premenna<<endl;
  9. cout<<"hodnota premennej je: "<<premenna<<endl;
  10. cout<<"adresa ukazovatela je: "<<&ukazovatel<<endl;
  11. cout<<"hodnota ukazovatela je: "<<ukazovatel<<endl;
  12. cout<<"hodnota ulozena na danej adrese je: "<<*ukazovatel<<endl;
  13.  
  14. system("PAUSE");
  15. return EXIT_SUCCESS;
  16. }

Výstupom programu je:

Ukazovatele sa používajú najmä pri:

Správe dát vo voľnom úložisku
Deklarovanie poli za behu programu
Posúvanie parametrov funkcii pomocou parametrov

Kľúčové slovo new a delete

Pomocou tohto kľúčového slova sa deklaruje premenná (vyhradí pamäť) vo voľnom uložisku. Voľne uložisko je miesto v pamäti, ktoré nie je vyhradene pre lokálne premenne, kód... Výhodou vyhradenia tejto pamäti pomocou tohto slova, je že nedôjde k jej uvoľneniu automaticky napríklad po skončení funkcie ako je tomu u lokálnych premenných. Predstavuje akýsi kompromis, medzi lokálnymi a globálnymi premennými. Taktiež je možne pomocou slova new vyhradiť pamäť dynamicky počas behu programu. Napríklad, keď nevieme ako veľké pole budeme potrebovať, deklarujeme iba ukazovateľ a pole už dynamicky za behu programu. Zápis použitia kl. slova new vyzerá:

Ukazovateľ, do ktorého sa má uložiť adresa daného miesta = new typ premennej, ktorú chceme ukladať.

Keďže nedochádza k uvoľneniu pamäte automaticky je potrebne ju uvoľniť pomocou kľúčového slova delete. Po skončení nášho programu by mal operačný systém pamäť uvoľniť, avšak patrí k dobrým zvykom, že keď pamäť vyhradíme, tak ju aj uvoľníme. Taktiež by mohlo dôjsť k vyčerpaniu pamäte počas behu programu.

Inicializácia ukazovateľa

V prípade, že ukazovateľu nepriradíte adresu hneď pri jeho deklarácií mali by ste mu priradiť hodnotu 0. Patri to k zásadám bezpečného programovania. Ak by sme napríklad zavolali na ukazovateľ, ktorý nemá priradenú adresu kľúčové slove delete, viedlo by to pravdepodobne k pádu systému. Zavolaním delete na nulový ukazovateľ (ukazovateľ s hodnotou nula) by sa nemalo nič stať.

Celú problematiku by mal vysvetliť nasledujúci program:

  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. int main(int argc, char *argv[])
  6. { unsigned long * ukazovatel = 0; //vytvoríme ukazovateľ a z bezpečnostných dôvodov mu priradíme hodnotu 0
  7. ukazovatel = new unsigned long; //do daného miesta bude možne uložiť údaj typu unsigned long
  8. *ukazovatel = 7;
  9. cout<<*ukazovatel<<endl;
  10. delete ukazovatel; //uvoľníme pamäť
  11. unsigned short velkost; //do premennej uložíme veľkosť dynamicky alokovaného pola
  12. cout<<"Zadajte velkost pozadovaneho pola\n";
  13. cin>>velkost;
  14. ukazovatel = new unsigned long [velkost];
  15. for(unsigned short i = 0; i<velkost; i++)
  16. ukazovatel[i] = i;
  17. for(unsigned long i = 0; i<velkost; i++)
  18. cout<<ukazovatel[i]<<endl;
  19. delete ukazovatel; //uvoľníme pamäť
  20. system("PAUSE");
  21. return EXIT_SUCCESS;
  22. }

Myslím, že vďaka komentárom nie je problém program pochopiť. Ešte by som chcel zvýrazniť jednu vec. Všimnite si, že pamäť priradenú k ukazovateľu uvoľníme pred tým, ako mu priradíme druhu oblasť pamäte (pole). V prípade, že by sme to nespravili, po uložení druhej adresy do ukazovateľa tu prvú nenávratne stratíme a pamäť nebude možne uvoľniť.

Najbližšie sa budeme pokračovať s problematikou ukazovateľov. Pozrieme sa na parametre funkcii v podobe ukazovateľov a podobne.

PrílohaVeľkosť
1.jpg24.94 KB
Povedz o článku aj ostatným - www.pridej.cz

Prihlásenie

Nové komentáre