C umožňuje vytvořit „dav“ kolem jedné paměťové buňky. Nemusíte se omezovat na jeden ukazatel. Libovolný počet ukazatelů může ukazovat na stejnou adresu. To není chyba. Toto je funkce, jak C zpracovává odkazy na paměť.
Zvažte jednoduchou celočíselnou proměnnou typu „i“. Můžete deklarovat tři různé ukazatele: p, q a r. Kód je extrémně jednoduchý.
Podívejte se na poslední řádek. r ukazuje na stejnou věc, na kterou ukazuje p. A protože p je již přiřazena adresa i, r ve skutečnosti také ukazuje na i.
Operátor přiřazení zkopíruje adresu z pravé strany na levou. Nekopíruje hodnotu uloženou na této adrese. Zkopíruje samotnou adresu. Toto je klíčový rozdíl v aritmetice ukazatele.
Po provedení kódu má i čtyři jména. Celé číslo můžete označit jako „i“. Můžete jej změnit pomocí *p. Můžete si to přečíst pomocí *q. Můžete na něj také odkazovat pomocí *r.
Počet ukazatelů, které mohou uložit stejnou adresu, není omezen. Pokud chcete, můžete deklarovat s, t a u. Všechny budou pouze aliasy pro stejné paměťové místo.
Tato flexibilita je důležitá. Umožňuje funkcím sdílet odkazy na data bez kopírování velkých struktur. Umožňuje vytvářet složité datové struktury, kde více uzlů ukazuje na stejného potomka. Díky tomu je správa zdrojů v C efektivnější.
To ale také přináší riziko. Pokud jeden ukazatel změní hodnotu, všechny ukazatele tuto změnu uvidí. Žádná izolace. Musíte být opatrní. Jeden ukazatel upravuje celé číslo. Ostatní to vidí okamžitě.
Proměnná
imá nyní čtyři názvy:i,*p,*qa*r.
Toto je základní ukazatelová aritmetika. Pro pochopení paměťových modelů v C je zásadní. Zde však začíná potíž. Více odkazů na jednu adresu znamená více způsobů poškození dat.
Můžete donekonečna řetězit přiřazení ukazatelů. `s = r; t = s;’. To vše ukazuje zpět na “i”. Kompilátoru to nezajímá. Doba provedení je také stejná. To jsou jen adresy paměti.
Proč je to důležité pro běžné uživatele? Pokud píšete kód v C, spoléháte na to. Pokud ladíte selhání programu, je to často příčina. Chybám bez použití po použití se daří v prostředích, kde jsou ukazatele znovu přiřazeny, ale nejsou zrušeny.
Efektivita jde za cenu složitosti. Musíte mít přehled o tom, kdo data vlastní. Kdo má právo je měnit? Pokud existuje více ukazatelů, je takové ovládání obtížnější.
Ale síla tohoto mechanismu je nepopiratelná. Můžete předávat ukazatele na funkce. Změňte hodnotu. Původní proměnná bude tuto změnu odrážet. Takto C dosahuje referenční sémantiky bez použití objektů.
Je to jednoduchý koncept. Zkopírujte adresu. Nekopírujte hodnotu. Povolit více názvům odkazovat na jedno místo. Používejte to moudře.




























