Ukazatele v C: proč více proměnných sdílí stejnou adresu paměti

10

V C můžete vytvořit více ukazatelů, které ukazují na stejné místo v paměti. To není chyba. To je vlastnost jazyka.

Můžete deklarovat tři ukazatele na celá čísla: p, q a r. Pak je můžete všechny nastavit tak, aby ukazovaly na stejnou celočíselnou proměnnou i.

Podívej, co se tady děje. p získá adresu ,i. qtaké přijímá adresu i. rzíská to, co je uloženo v p`. Konkrétně adresa „i“.

Po provedení tohoto kódu nastává zvláštní situace. Proměnná i má nyní čtyři názvy. Můžete na něj odkazovat pomocí i, *p, *q nebo *r. Všechny odkazují na stejnou oblast v paměti RAM.

Jak funguje přiřazení ukazatelů

Když přiřadíte jeden ukazatel druhému, nekopírujete hodnotu, na kterou ukazují. Kopírujete adresu.

r = p nekopíruje celé číslo i. Zkopíruje adresu paměti uloženou v p. Protože p obsahuje adresu i, r nyní obsahuje také adresu i.

Počet ukazatelů, které mohou sdílet jednu adresu, není omezen. Můžete mít deset ukazatelů. Nebo sto. Všechny jednoduše ukazují na totéž.

Proč je to důležité

Toto chování mění způsob, jakým přemýšlíte o datech. Jedna proměnná v paměti může mít mnoho aliasů. Pokud změníte hodnotu pomocí jednoho ukazatele, změna se projeví u každého druhého ukazatele.

Nyní se i rovná 10. *q se rovná 10. *r se rovná 10. Všechny se dívají na stejná data.

To je užitečné. To vám umožní předávat odkazy na funkce bez kopírování velkých struktur. To umožňuje různým částem vašeho kódu pracovat na stejných datech. Ale to také znamená, že musíte být opatrní. Změna prostřednictvím jednoho ukazatele může ovlivnit ostatní.

Běžné mylné představy

Někteří začínající vývojáři si myslí, že přiřazení ukazatele kopíruje data. To je špatně. Adresa se zkopíruje.

Jiní se ptají, jestli existuje nějaký limit. Je pryč. Jazyk vám umožňuje vytvořit tolik ukazatelů, kolik potřebujete. Kompilátor tomu nebrání.

Shrnutí

Více ukazatelů může ukazovat na stejnou adresu. Toto je standardní chování v C. Můžete si vzájemně přiřazovat ukazatele. Zkopíruje se adresa, nikoli hodnota. Proměnná zůstává stejná. Počet jejích „jmén“ prostě přibývá.

“Neexistuje žádné omezení počtu ukazatelů, které mohou uložit (a tedy ukazovat na) stejnou adresu.”

Tato flexibilita je mocná. Vyžaduje to disciplínu. Ale to je zásadní pro to, jak C funguje. Pokud tomu rozumíte, rozumíte jednomu z klíčových konceptů správy paměti v C.