Proč může více ukazatelů ukazovat na stejnou adresu v C

4

V C můžete při práci s pamětí vytvořit chaos i přehlednost. Můžete mít více ukazatelů směřujících na stejnou část paměti RAM. To není chyba. Toto je funkce.

Zvažte scénář, ve kterém deklarujete celočíselnou proměnnou i. Poté vytvoříte tři celočíselné ukazatele: p, q a r.

Kód dělá přesně to, co byste mohli očekávat. p získá adresu ,i. "q" dělá to samé. rzkopíruje to, co je uloženo v p. Protože pobsahuje adresu i, rtaké ukazuje na i`.

Po provedení těchto přiřazení máte jednu proměnnou se čtyřmi názvy. “i” je původní proměnná. *p na to odkazuje. “q” na to odkazuje. “ r” na to odkazuje.

Jak funguje přiřazení ukazatelů

Klíčem je zde pochopit, co se děje během úkolu. Když napíšete q = &i, nekopírujete hodnotu i. Zkopírujete umístění i.

Když napíšete r = p, zkopírujete adresu z p do r. Nová paměť není přidělena. Data nejsou duplicitní. Hodnota adresy se přesune z jedné proměnné ukazatele do druhé.

To znamená, že neexistuje žádné pevné omezení počtu ukazatelů, které mohou uložit stejnou adresu. Můžete vytvořit tisíc ukazatelů ukazujících na „i“. Všechny odkazují na stejné místo v paměti.

Počet ukazatelů, které mohou uložit (a tedy ukazovat na) stejnou adresu, není omezen.

Toto chování je zásadní pro to, jak C spravuje paměť. Umožňuje vám vytvářet flexibilní datové struktury, jako jsou propojené seznamy a stromy. Umožňuje také efektivní předávání argumentů funkcím. Místo kopie předejte ukazatel. Přímo upravujte zdrojová data.

To ale také vytváří riziko. Změňte „i“ na „p“. Podívejte se na „i“ až „q“. Změna bude viditelná všude. Existuje pouze jeden zdroj pravdy.

Proměnná i má nyní čtyři názvy. ‘já’. *p. „*q“. *r.

Takto funguje C. Máte přímý přístup k adresám paměti. Můžete volně vytvářet aliasy pro data. Jen si musíte dávat pozor, co měníte.