last modified 9/2/2013 14:45 new

Protože jsem se konečně zbavil několika termínů a zkoušek, je na čase přispět
__konečně__ i svou troškou do mlýna. Na FI je celkem běžné že studenti fungují i
jako cvičící, a to i ti netitulovaní. Stejně tak já - jsem cvičícím
programovacích předmětů. Součástí toho co se snažíme studenty naučit je také
práce s pamětí. A to znamená ukazatele.

Trocha úvodu: paměť počítače se počítá v malých jednotkách, tzv. bytech. Každý
byte někde musí být uložený, informaci o tom kde je uložený říkáme adresa. Když
máme v programu proměnnou do které ukládáme celé číslo (typ int), zabírá 4B
paměti. A protože zabírá paměť, tak má adresu. Když máme v programu nějaký text
- třeba chybovou hlášku pro uživatele - také zabírá místo. Má tedy také adresu.
A protože ze začátku věty snadno dojdeme na její konec, je adresou věty (hlášky)
právě adresa jejího prvního písmene, tedy jejího prvního byte. Ukazatel je tedy
proměnná, do které schováme adresu abychom poté dovedli tuto hlášku najít.

Příklady - vlevo od // je kód, vpravo komentář
int a = 40; // celočíselná proměnná "a", obsahuje číslo 40
int * b = &a; // proměnná jménem "b", typem ukazatel (hvězdička znamená
// ukazatel na to co je vlevo od hvězdičky - tedy ukazatel
// na celočíselnou proměnnou) do které si schovám kde je
// v paměti umístěna proměnná "a"
int ** c = &b; // proměnná jménem "c", typem ukazatel na ukazatel (začnu
// nejpravější hvězdičkou a jdu vlevo), do které si uložím
// kde najdu "b"
a = 20; // do a teď schovám číslo 20
*b = 30; // skoč tam co ukazuje b, a ulož číslo 30
**c = 10; // skoč tam co ukazuje c a vykonej další skok a teprve
// potom ulož 10
*c = 90; // skoč tam co ukazuje c a zapiš na to místo číslo 90;
// c ale ukazuje na b - takže tímto zápisem způsobíme že
// b už nebude ukazovat na a, ale na 90. buňku paměti počítače

Občas (rozumějte celkem často) se pak vyskytují v praktické aplikaci výše
zmíněného výrazy jako **a->x = (**((*b)->y)).z ; které už ale začínají studentům
dělat problémy. Minulý rok jsem se snažil naučit studenty tyto konstrukce číst a
psát pomocí křídy, tabule, střídání lidí a zhoršování příkladů. Letos koupím
matrjošku, na každou z panenek napíšu fixou kus výrazu a nechám studenty ať to
správně poskládají. A jestli ani to nepomůže, mám nachystanou cibuli.

Jestli chcete vědět jak to dopadne, napište.