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äte 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 . |
|
|