Hoe meerdere pointers naar één adres verwijzen in C

6

Met C kun je een menigte creëren rond een enkele geheugenlocatie. U hoeft geen genoegen te nemen met één aanwijzer. Een willekeurig aantal verwijzingen kan naar hetzelfde adres verwijzen. Dit is geen bug. Het is een kenmerk van hoe C omgaat met geheugenreferenties.

Beschouw een eenvoudige gehele variabele i. Je kunt drie verschillende pointers declareren: p, q en r. De code is eenvoudig.

Kijk eens naar die laatste regel. r verwijst naar hetzelfde waar p naar verwijst. En aangezien aan p al het adres i is toegewezen, wijst r in feite ook naar i.

De toewijzingsoperator kopieert het adres van de rechterkant naar de linkerkant. De waarde die op dat adres is opgeslagen, wordt niet gekopieerd. Het kopieert de locatie zelf. Dit is een belangrijk onderscheid in de aanwijzerberekening.

Na uitvoering heeft i vier namen. U kunt naar het gehele getal verwijzen als ‘i’. Je kunt het wijzigen via *p. Je kunt het lezen via *q. Je kunt er ook toegang toe krijgen via *r.

Er is geen limiet aan het aantal pointers dat hetzelfde adres kan bevatten. Je zou ‘s’, ‘t’ en ‘u’ kunnen declareren als je dat wilt. Het zouden allemaal slechts aliassen zijn voor hetzelfde stukje geheugen.

Deze flexibiliteit is van belang. Hiermee kunnen functies verwijzingen naar gegevens delen zonder grote structuren te kopiëren. Het maakt complexe datastructuren mogelijk waarbij meerdere knooppunten naar hetzelfde kind verwijzen. Het maakt het beheer van bronnen in C efficiënter.

Maar het introduceert ook risico’s. Als één aanwijzer de waarde wijzigt, zien alle aanwijzers de verandering. Er is geen isolatie. Je moet voorzichtig zijn. Eén aanwijzer verandert het gehele getal. De anderen zien het meteen.

De variabele i heeft nu vier namen: i, *p, *q en *r.

Dit is eenvoudige aanwijzerberekening. Het is van fundamenteel belang voor het begrijpen van C-geheugenmodellen. Maar het is ook waar het lastig wordt. Meerdere verwijzingen naar hetzelfde adres betekenen meerdere manieren om gegevens te corrumperen.

U kunt aanwijzertoewijzingen eindeloos aan elkaar koppelen. s = r; t = s;. Het verwijst allemaal terug naar ‘i’. Het maakt de compiler niet uit. De looptijd maakt niet uit. Het zijn gewoon geheugenadressen.

Waarom is dit belangrijk voor gewone gebruikers? Als u C-code schrijft, vertrouwt u hierop. Als u een crash debugt, is dit vaak de boosdoener. Use-after-free-fouten gedijen goed in omgevingen waar pointers opnieuw worden toegewezen maar niet teniet worden gedaan.

De efficiëntie heeft een prijs. Complexiteit. Je moet bijhouden wie de eigenaar is van de gegevens. Wie mag het wijzigen. Met meerdere aanwijzingen wordt het volgen moeilijker.

Maar de kracht valt niet te ontkennen. U kunt verwijzingen naar functies doorgeven. Wijzig de waarde. De oorspronkelijke variabele weerspiegelt de verandering. Het is hoe C referentiesemantiek bereikt zonder objecten.

Het is een eenvoudig concept. Kopieer het adres. Kopieer de waarde niet. Laat meerdere namen naar één locatie verwijzen. Gebruik het verstandig.