4.  Mám ukazovateľ, čo s ním?

4.1  Referenčný operátor &

Na začiatok príklad:
int i; pointers2.jpg

Pre deklarovanú premennú i sa po spustení programu vyhradí v pamäti potrebný priestor (jeho veľkosť zodpovedá typu premennej, čiže v prípade int-u zvyčajne 4 bajty).

i = 308;  pointers3.jpg

Potom môžeme do tejto premennej napr. príkazom priradenia uložiť hodnotu. Pred príkazom priradenia premenná obsahovala pravdepodobne náhodnú hodnotu! (Len lokálne premenné, ktoré sú v pamäťovej triede static ako aj globálne premenné, sú implicitne inicializované na 0. Ale ani na to sa radšej netreba spoliehať :-)


Viackrát sme už zdôraznili, že smerník je tiež len premenná. Deklaráciou dosiahneme iba to, že sa v pamäti počítača vyhradí miesto potrebné pre uloženie premennej typu ukazovateľ, teda 32 bitov pre "akúsi" adresu. Ale v tejto chvíli je smerník ešte nepoužiteľný! Ukazuje totiž na náhodné miesto v pamäti, čo neveští nič dobré. (Neinicializovaná premenná vždy pôsobí podzrivo :-)

int *p;pointers4.jpg

Jedinou úlohou ukazovateľa je ukazovať na premenné určitého typu. Každá premenná je v pamäti uložená na nejakej adrese. Ak má teda smerník ukazovať na túto premennú, musíme poznať jej adresu (resp. táto adresa musí byť známa). Adresa ľubovoľnej premennej sa dá získať pomocou referenčného (adresového) operátora &. Je to unárny operátor, má teda len jediný operand a tým je práve premenná, ktorej adresu požadujeme. Tú môžeme ľahko zistiť nasledovne:

printf("Tato premenna sa nachadza na adrese %p\n", &i);


p = &i;pointers5.jpg

Príkazom priradenia sme adresu premennej i uložili do premennej p. Môžeme povedať, že pointer p ukazuje na premennú i.

  Adresový operátor sme aj doteraz bežne používali pri načítavaní hodnôt premenných zo štandardného vstupu (z klávesnice):   scanf("%d", &i);

Inicializáciu ukazovateľa adresou nejakej premennej môžeme zabezpečiť aj priamo v deklarácii:

int i, *p = &i;

i je premenná typu int, p je ukazovateľ, ktorý ukazuje na túto premennú.