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á).
|