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

4.7  Význam deklarácie typu ukazovateľ

Deklaráciou špecifikujeme typ premenných, na ktoré môže pointer ukazovať. Tento už nikdy nesmie ukazovať na premennú iného typu! Ale prečo? Všetky ukazovatele majú predsa rovnakú veľkosť! Sú to predsa pamäťové miesta pre uchovanie adresy a tá má vždy rovnakú veľkosť, zväčša 32 bitov t.j. 4 bajty. Áno, to je fakt. Tak prečo musíme hovoriť o ukazovateľoch rôznych typov, keď sú všetky rovnako veľké? Zdanlivý paradox hneď objasníme:

Operačnú pamäť počítača môžme pokladať za postupnosť bajtov, ktorých pozíciu v tejto postupnosti jednoznačne charakterizuje práve adresa. Uvažujme úsek pamäte ako na obrázku:

Každé okienko predstavuje 1 bajt v pamäti a číslo pod ním je jeho adresa. Jeden bajt je najmenšou adresovateľnou jednotkou pamäte. Ak teda poznáme adresu, môžeme nájsť a sprístupniť ľubovoľný bajt v pamäti.



Uvažujme jeden int, tri char-y a jednu premennú typu double. Predpokladajme, že sme ich deklarovali v tomto poradí a že sú v pamäti uložené za sebou tak ako na obrázku:

Ak povieme, že premenná má adresu 327, znamená to, že na tejto adrese začína a ďalej pokračuje spojito cez toľko bajtov, koľko je na uloženie príslušného typu potrebných. Keďže vo väčšine moderných systémoch je int štvorbajtovým údajovým typom, na uloženie jedného int-u potrebujeme 4 bajty. Podobne typ char vyžaduje 1 bajt, double až 8 bajtov. Z obrázku je zrejmé, ktorý bajt patrí ktorej premennej. Ale céčko to takto samozrejme nerobí! Céčko "chápe" tento úsek pamäte takto:


Teraz je už jasné, prečo musíme pointer deklarovať a vždy používať pointer správneho typu. Ak by sme napr. chceli pomocou ukazovateľa pracovať s premennou typu int, ktorá je na začiatku nášho fiktívneho bloku pamäte, deklarujeme ukazovateľ na int a priradíme mu adresu 327. Použitím operátora * na náš ukazovateľ v podstate počítaču povieme: "Choď v pamäti na túto adresu, prečítaj príslušný bajt ako aj nasledujúce 3 bajty a považuj ich spoločne za 1 int." Deklaráciou ukazovateľa teda počítaču vlastne hovoríme, kedy má prestať čítať dáta.

Pointer ukazuje na premennú istého typu, obsahuje adresu bajtu, kde premenná začína. Vďaka deklarácii počítač vie, o aký typ ukazovateľa sa jedná a vie teda aj to, kde táto premenná končí (akú má veľkosť, koľko bajtov zaberá).