Hledejte v chronologicky řazené databázi studijních materiálů (starší / novější příspěvky).

13. Ukazatele, aritmetické operace s ukazateli.

Ukazatele
Ukazatel je v podstatě proměnná jako každá jiná. Liší se jen způsob, jak se s ní pracuje. Klasická proměnná představuje určitý kus paměti, ve které je uložena hodnota této proměnné. To platí i pro pointery, jenže v jejich případě je touto hodnotou adresa nějakého místa v paměti. Říkáme pak, že pointer na místo určené touto adresou ukazuje.

Bázový typ ukazatele
Bázový typ ukazatele určuje, jak se bude interpretovat místo v paměti, kam tento pointer ukazuje. Například, je-li bázovým typem ukazatele typ int, znamená to, že obsah paměti, kam pointer ukazuje, se bude interpretovat jako datový objekt typu int. Bázový typ ukazatele určujeme při jeho definici, je ale možné určit ho až za běhu programu.

Definice proměnné typu ukazatel
bázový_typ *identifikátor;

Ukazatele definujeme podobně jako jiné proměnné. Rozdílem je, že před identifikátorem musíme uvést ještě znak ‘*‘, kterým dáme překladači vědět, že definujeme pointer. Není potřeba navzájem od sebe oddělovat definice obyčejné proměnné a pointeru, jejichž bázový typy je stejný.

int i, *p2;

S pamětí, kam tyto pointery ukazují, lze pracovat, tedy číst a zapisovat do ní. V takovém případě můžeme lehce přepsat paměť používanou jinými programy nebo systémem samotným. To má většinou za následek zhroucení programu. Proto musíme ukazatel inicializovat nějakou smysluplnou hodnotou ještě před jeho prvním použitím.

Referenční operátor &
Abychom mohli do ukazatelové proměnné přiřadit hodnotu (nějakou adresu), musíme ji nejprve někde získat. K tomu nám může posloužit referenční operátor '&'. Jeho zapsáním před identifikátor proměnné získáme adresu paměti, kde je tato proměnná uložena. Tuto adresu pak můžeme přiřadit nějaké ukazatelové proměnné.

Příklad:
char *p, c;

c = 12;
p = &c;
// p nyní ukazuje na proměnnou c

Operátor dereference *
Pomocí pointeru můžeme přistupovat k datovému objektu, na který ukazuje. K tomu nám poslouží operátor dereference '*'. Použitím tohoto operátoru na ukazatel získáme objekt, na který ukazatel odkazuje, přičemž typ takto získaného objektu bude shodný s bázovým typem dereferovaného ukazatele.

Příklad:
int i=10, *p;

p = &i;
*p = 20; //zápis ekvivalentní i=20;
printf("%d", i); //Vypíše se 20

Ukazatele NULL
Jedním z případů, kdy ukazatele inicializujeme konstantní hodnotou je přiřazení symbolické konstanty NULL. Má-li pointer přiřazenu hodnotu NULL, znamená to, že nikam neukazuje.

Inicializace při definici
Pointery lze, stejně jako jiné proměnné, inicializovat již při definici, ale namísto konstantní hodnoty se inicializují adresou některé dříve nadefinované proměnné, nebo hodnotou jiného pointeru. Případně konstantou NULL.

Ukazatel typu void (generický ukazatel)
Pokud nadefinujeme ukazatel, jehož bázovým typem bude void (tzv. generický ukazatel), dáváme tím najevo, že bázový typ pointeru není předem určen. Do takového pointeru lze po přetypování přiřadit hodnotu ukazatele libovolného bázového typu.
Chceme-li dereferovat ukazatel typu void, musíme ho vždy nejdřív přetypovat!

int i;
void *p;

(int*)p=&i;
*(int*)p=36;
printf ("%d", i);

Aritmetické operace s ukazateli viz předchozí otázka č. 13

Žádné komentáře:

Okomentovat