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á:
#include <iostream> using namespace std; int main(int argc, char *argv[]) { long premenna = 5; long * ukazovatel = &premenna; cout<<"adresa premennej je: "<<&premenna<<endl; cout<<"hodnota premennej je: "<<premenna<<endl; cout<<"adresa ukazovatela je: "<<&ukazovatel<<endl; cout<<"hodnota ukazovatela je: "<<ukazovatel<<endl; cout<<"hodnota ulozena na danej adrese je: "<<*ukazovatel<<endl; system("PAUSE"); return EXIT_SUCCESS; }
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:
#include <iostream> using namespace std; int main(int argc, char *argv[]) { unsigned long * ukazovatel = 0; //vytvoríme ukazovateľ a z bezpečnostných dôvodov mu priradíme hodnotu 0 ukazovatel = new unsigned long; //do daného miesta bude možne uložiť údaj typu unsigned long *ukazovatel = 7; cout<<*ukazovatel<<endl; delete ukazovatel; //uvoľníme pamäť unsigned short velkost; //do premennej uložíme veľkosť dynamicky alokovaného pola cout<<"Zadajte velkost pozadovaneho pola\n"; cin>>velkost; ukazovatel = new unsigned long [velkost]; for(unsigned short i = 0; i<velkost; i++) ukazovatel[i] = i; for(unsigned long i = 0; i<velkost; i++) cout<<ukazovatel[i]<<endl; delete ukazovatel; //uvoľníme pamäť system("PAUSE"); return EXIT_SUCCESS; }
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íloha | Veľkosť |
|---|---|
| 1.jpg | 24.94 KB |


Nové komentáre
pred 2 dni 2 hod
pred 2 dni 10 hod
pred 2 dni 12 hod
pred 2 dni 12 hod
pred 3 dni 9 hod