9. Ukazovatele a polia
9.1 Pointerová aritmetika
S premennými typu ukazovateľ môžeme vykonávať aj
niektoré aritmetické operácie. Je ich síce podstatne menej ako
aritmetických operácií s normálnymi premennými, o to sú však
zaujímavejšie. V Pascale sa na hodnotách typu ukazovateľ nedajú
vykonávať žiadne aritmetické operácie!
Súčet ukazovateľa a celého čísla
Nech p je ukazovateľ istého typu:
*p = *p + n;
Hodnotu premennej, na ktorú p ukazuje sme práve zväčšili o n. Výsledok priradenia
p = p + n;
však takto interpretovať nemôžeme! Zamyslime sa, čo sme práve urobili. Pripočítali sme číslo n k adrese, nie k hodnote! A to mení situáciu.
Hodnota ukazovateľa predstavuje adresu. Ak ide
o pointer na int, je to adresa premennej typu int; ak ide
o pointer na char, je to adresa premennej typu char atď.
Ukazovateľ obsahuje v skutočnosti číslo, napr. číslo 330. Očakávali by
sme, že pripočítaním celého čísla, napr. 1, jednoducho
zväčšíme hodnotu ukazovateľa na 331. To však vôbec nemusí byť pravda!
Keď k pointeru pripočítame číslo, neznamená to ešte, že sa adresa,
ktorú pointer obsahuje, zväčší práve o toľko bajtov. Ak by sme
totiž k pointeru na int (pripomeňme si, že int zaberá 4 bajty)
pripočítali napr. 2, výsledok by nedával žiaden zmysel. Ak by totiž
pôvodná hodnota p bola 330, po príkaze p = p + 1; by p obsahoval adresu 332 a ukazoval tak "doprostred" premennej typu int, čo evidentne nie je v poriadku.
Pointerová aritmetika
funguje našťastie inak. K pointeru sa nepripočíta príslušné celé
číslo, ale násobok tohto čísla a veľkosti typu, na ktorý pointer
ukazuje. |
|
Pripočítať n k pointeru na int teda znamená posunúť sa v súvislom bloku pamäti o n int-ov "ďalej". Výraz p + n teda predstavuje adresu n-tého prvku za prvkom, na ktorý práve ukazuje p .
Je zrejmé, že ak by na adrese p + n
nebol uložený opäť int, veľa by sme takouto operáciou nezískali. Práve
naopak. Nasledujúce 4 bajty by sa pokladali za 1 int, hoci v
skutočnosti by napr. mohlo ísť o 2 premenné typu char
a prvé dva bajty premennej typu double. Pri pointerovej aritmetike
sa oprávnene predpokladá, že sa pohybujeme v súvislom bloku
premenných rovnakého typu. A to je predsa pole!!! :-) Je len na programátorovi, aby si ustrážil, či pointer ukazuje na to, čo má.
Rozdiel ukazovateľov
Ak p1, p2 sú ukazovatele rovnakého typu a ukazujú na prvky rovnakého poľa, tak výraz
p2 - p1
má
zmysel. Jeho výsledkom je počet prvkov poľa, ktoré ležia medzi týmito
ukazovateľmi, pričom prvkom rozumieme údajový typ zhodný s typom
ukazovateľov p, q . |
|
|