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.