Počítačový program musí při ukládání dat sledovat tři základní vlastnosti:
Kde je informace uložena,
jakou má hodnotu,
jaký druh informace je uložen.
Jak zjistit adresu proměnné:
Výstup:
Hodnota promenne a: 10
jeji adresa: 0x6dfeec
Jedná se o zvláštní typ proměnné, který obsahuje adresu hodnoty.
Když napíšeme int *adresa, tak se nám vytvoří proměnná, stejně jako když deklarujeme int a.
Díky ukazateli můžeme přistupovat k samotné hodnotě proměnné jak klasicky, tak přes její adresu.
Každý ukazatel zabírá v paměti právě 4 bajty.
int *adresa (tedy ukazatel) má taky svou vlastní adresu, ale jako hodnotu si bere adresu cizí proměnné.
Výstup:
Hodnota promenne a: 10
adresa: 0x6dfeec
adresa pomoci ukazatele: 0x6dfeec
Počítač musí sledovat typ proměnné, na kterou se ukazatel odvolává.
Adresa proměnné char nebo float vypadá stejně, ale každý typ používá jiný počet bajtů, proto musí deklarace ukazatele specifikovat, na jaký typ dat ukazatel ukazuje:
int *adresa;
Tento zápis stanovuje, že *adresa je typu int.
Říkáme, že adresa ukazuje na int nebo adresa je ukazatel, *adresa je int (nikoli ukazatel, viz dereferenční operátor).
Deklarace int *p1, p2; vytvoří jeden ukazatel (p1) a jednu klasickou proměnnou (p2) typu int.
Na deklaraci ukazatelů ostatních typů použijeme stejnou syntaxi:
double *meridlo;
char *str;
Problém:
int *prom;
*prom = 123;
Ukazateli prom se nepřiřadila adresa, proto není možné říct, kam se uložila hodnota 123.
Dereferenční operátor * nám umožňuje zpřístupnit hodnotu na dané adrese.
Výstup:
adresa pomoci ukazatele: 0x6dfeec
hodnota na adrese: 10
Výstup:
Adresa pomoci ukazatele: 0x6dfeec
Hodnota na adrese: 10
Nova hodnota promenne na adrese: 34
Hodnota promenne a: 34
Dejme tomu, že chceme mít v programu funkci, která zvýší hodnotu proměnné o 10.
Asi by nás napadlo napsat nějaký takový program:
Výstup:
20
Tento program ale nefunguje, jelikož funkce si vytvoří lokální proměnnou „cislo“, do které uloží hodnotu proměnné "cisilko", a nepracuje přímo s proměnnou „cisilko“.
Řešením je použití ukazatele.
Funkci zvysovac předáme adresu proměnné, jejíž hodnotu chceme zvýšit.
Výstup:
21
Pomocí ukazatele lze manipulovat s prvky daného pole, a to z toho důvodu, že pole je vlastně ukazatelem na místo v paměti, kde se nachází první prvek tohoto pole.
Platí tedy:
*pole je ekvivalentní pole[0]
*(pole+1) je ekvivalentní s pole[1]
*(pole + n) je ekvivalentní s pole[n]
Výstup:
Adresa pole: 0x7ffdd03a3c50
Hodnota prvniho prvku: 1
Hodnota druheho prvku: 2
Z toho plyne, že pokud je pole argumentem funkce, tak při modifikaci tohoto pole ve funkci dojde k modifikaci "původního" pole (toto se při práci s jednoduchými proměnnými neděje!):
Výpis:
11 2 3 4 5
Alternativní zápis pomocí ukazatele: