Meerdere aanwijzers die naar één geheugenadres wijzen

10

Met C kun je iets doen dat er op het eerste gezicht rommelig uitziet. U kunt meerdere verwijzingen hebben die naar exact dezelfde geheugenlocatie verwijzen. Het is geen bug. Het is een functie.

Overweeg deze opstelling. Je declareert een geheel getal i. Vervolgens declareer je drie pointers: p, q en r.

Kijk eens wat hier gebeurt. p pakt het adres van i. q doet hetzelfde. r geeft niet direct om i. Het kopieert gewoon het adres dat p bevat. Omdat p naar i verwijst, wijst r uiteindelijk ook naar i.

Nadat deze regels zijn uitgevoerd, zweven er geen drie afzonderlijke variabelen meer rond. Je hebt één variabele met vier aliassen.

  • ik
  • *p
  • *q
  • *r

Ze zijn allemaal hetzelfde.

Dit gebeurt omdat de pointertoewijzing een waardekopie van het adres is. Het adres aan de rechterkant wordt verplaatst naar de variabele aan de linkerkant. Er vindt geen diepe kopie van de gegevens plaats. Alleen de geheugenlocatie wordt overgedragen.

Hieraan is geen limiet verbonden. Je kunt zoveel verwijzingen aan elkaar koppelen als je wilt. een = b; c = b; d = c; Het maakt niet uit. Ze wijzen allemaal naar dezelfde plek in het RAM-geheugen.

Er is geen limiet op het aantal pointers dat kan vasthouden en dus naar hetzelfde adres kan verwijzen.

Waarom doet dit er toe? Het betekent dat u vrijelijk referenties kunt doorgeven. U kunt aliasgegevens voor verschillende delen van uw code gebruiken. U kunt complexe datastructuren creëren waarbij knooppunten naar elkaar verwijzen.

Het betekent ook voorzichtigheid. Verander *p in 5. Wat gebeurt er met ‘ik’? Het wordt ‘5’. *q wijzigen? ‘i’ verandert weer. Alle aliassen zien dezelfde update.

Dit is basis-C. Maar het is krachtig. En gevaarlijk als je niet meer weet welke aanwijzer welke is.