Většina vývojářů se setkává s ukazateli v C prostřednictvím specifického mechanismu známého jako předávání ukazatele. Toto není jen syntaktický rys; to je základní důvod, proč funkce mohou měnit vnější stav. Pravděpodobně jste to už viděli, aniž byste si to uvědomovali. Podívejme se na funkci scanf. Pokaždé, když zavoláte scanf, musíte před své proměnné přidat operátor adresy (& ).
scanf("%d", &mojeČíslo);
Pokud tento ampersand vynecháte, program se zhroutí. Proč? Protože scanf očekává adresu paměti, nikoli hodnotu. Pochopení tohoto chování odhalí logiku jak C zachází s parametry funkcí. Když předáte ukazatel, dáváte funkci oprávnění k přístupu do paměti a přímo k přepisování dat.
Зміст
Selhání předání hodnoty
Abychom pochopili, proč jsou ukazatele potřeba, musíme se podívat na to, co se stane, když tam nejsou. Běžnou začátečnickou chybou je pokus napsat funkci swap, která zamění dvě celočíselné hodnoty.
Zde je naivní implementace, která nefunguje:
Spusťte tento kód. Na výstupu se zobrazí „5 10“ následované „5 10“. Výměna neproběhla.
Důvod je prostý. V C jsou argumenty standardně předávány podle hodnoty. Když se zavolá swap(a, b), systém vytvoří místní kopie a a b, pojmenované i a j. Funkce dokonale prohodí hodnoty i a j. Ale když funkce skončí, tyto lokální proměnné jsou zničeny. Původní a a b v main zůstávají nezměněny.
Řešení: míjení ukazatelem
Ke změně zdrojových proměnných potřebuje funkce přístup k jejich skutečným adresám v paměti, nikoli ke kopiím jejich hodnot. Zde se ukazatele jako parametry funkcí stávají nepostradatelnými.
Zde je opravená implementace:
Nyní bude výstup 5 10 následovaný 10 5. Výměna fungovala.
Jak funguje dereferencování ukazatelů
Rozdíl je v tom, co je předáno do funkce.
- Call:
swap(&a, &b)předá adresyaab. - Parametry: Signatura funkce
void swap(int *i, int *j)deklarujeiajjako ukazatele na celá čísla. - Komunikace: Uvnitř
swapije adresaa.jobsahuje adresub. - Dereferencování: Operátor
*i = *jznamená “přesunout se na adresu paměti uloženou via zapsat do ní hodnotu nalezenou na adrese paměti uložené vj“.
Vizualizujte dva rámečky označené „a“ a „b“.
– “a” obsahuje “5”.
– “b” obsahuje “10”.
– “i” je poznámka s adresou pole “a”.
– j je poznámka s adresou pole b.
Když kód provede t = *i, přečte poznámku i, přejde na tuto adresu a přečte hodnotu 5. Ukládá 5 do t. Potom *i = *j přečte hodnotu z pole b (což je 10 ) a zapíše ji zpět do pole a. Původní krabice se změnily.

























