Může více ukazatelů odkazovat na stejnou proměnnou v C?

4

Toto je vlastnost jazyka C, která často mate nováčky, ale jakmile se to vyjasní, vypadá to jako kouzlo: můžete mít více ukazatelů směřujících na stejnou adresu paměti.

Zvažte tento scénář. Deklarujete celočíselnou proměnnou i. Potom deklarujete tři ukazatele p, q a r. Všem jim přiřadíte adresu proměnné i.

Podívejte se na poslední řádek. r nemusí vědět o i přímo. Ukazuje pouze tam, kde ukazuje p. A “p” ukazuje na “i”. Proto r také ukazuje na i.

Operátor přiřazení zde zkopíruje adresu, nikoli hodnotu. Když uděláte r = p, nekopírujete celé číslo obsažené v i. Kopírujete adresu paměti, která je uložena v p.

Po spuštění tohoto kódu má i v podstatě čtyři jména. Můžete k němu přistupovat pomocí „i“. Můžete na něj odkazovat pomocí *p. Můžete na něj odkazovat pomocí *q. Nebo na něj můžete odkazovat pomocí *r.

Neexistují žádná technická omezení na počet ukazatelů, které lze tímto způsobem „akumulovat“.

Proč je to důležité?

Toto není jen akademická syntaxe. Mění způsob, jakým přemýšlíte o toku dat.

V jazycích se silnými odkazy na objekty kopírování objektu často vytváří novou instanci v paměti. V C je kopírování ukazatele levné. Je to jen adresa paměti. Rychle. Malý.

To umožňuje různým částem vašeho kódu manipulovat se stejnými daty bez duplikace. Změna *p a *q okamžitě uvidí změnu.

Vytváříte aliasy paměti.

Riziko pseudonymů

Zde se „skvělá funkce“ mění v nevýhodu.

Pokud všechny p, q a r ukazují na i, kterýkoli z nich může změnit i.

Nyní se „i“ rovná 10. „q“ se rovná 10. „ r“ se rovná 10.

Ale co když zapomenete, že r také následuje i? Můžete předpokládat, že i je stabilní, protože jste se ho přímo nedotkli. Dotkli jste se pouze *q.

Toto je sdílený zdroj. A sdílené zdroje jsou místa, kde žijí podmínky závodu a neočekávané přepisy dat.

Jak předejít nezamýšleným vedlejším účinkům

Pokud se chcete ujistit, že jeden ukazatel omylem nepřepíše data určená pro jiný, použijte const.

Nyní r umí číst i. Může na ni ukázat. Ale nemůže to změnit.

Tímto způsobem nastavíte hranice v jazyce, který vám důvěřuje při ruční správě paměti.

Kde se používá při programování systémů

Tento vzor je v celém systémovém kódu.

Struktury jádra mají často více ukazatelů na stejný řídicí blok. Ovladače zařízení mapují stejné hardwarové registry na různé logické názvy.

Pochopení, že ukazatele jsou jednoduše štítky pro adresy, vám pomůže tyto problémy ladit. Když dojde k poškození paměti, sledujte ukazatele. kdo jiný