Wat betekent (int *) p?


Beste antwoord

(int *) p is een expliciet type casting voor de waarde opgeslagen in variabele p, naar het type pointer waarvan het adres naar een geheel getal verwijst. De waarde die p opslaat is een geheugenadres van de 1e byte van de 4 die wordt gebruikt om het 32 ​​bit (4 byte) geheel getal op te slaan.

Een pointer slaat een getal op dat moet het adres zijn van een specifieke locatie in het geheugen (Heap of Stack). Het type gegevens dat op die locatie is opgeslagen, kan alles , en in deze uitdrukking specificeren we (of nemen we liever aan) dat het een geheel getal van 4 bytes is.

De waarde van p kan worden getypt voordat deze aan een andere pointer wordt toegewezen –

int *c = (int *) p;

Of er kan geen verwijzing naar worden gemaakt om de waarde op te halen die is opgeslagen in het adres van p als dusdanig –

int c = *((int *) p);

Of als p inderdaad zelf een aanwijzer is, kan er zonder deze verwijzing naar worden afgeleid expliciet worden getypeerd omdat we weten dat de waarde die erin is opgeslagen een geheel getal van 4 bytes is.

Eenvoudigheidshalve heb ik de aanwijzingen niet nul gecontroleerd. Het is heel belangrijk dat u controleert of een pointer null is, omdat het verwijderen van een null-pointer leidt tot een crash.

Voorbeeld van een null check –

if (p != null)

printf(“int is ‘\%d’”, *p);

Aangenomen dat de adres correct is en dat de pointer niet null is en dat het gegevenstype dat is opgeslagen in de geheugenlocatie in feite een geheel getal is, zal uw console het correct afdrukken .

Hier is een gedetailleerd en goed uitgelegd artikel dat ik een paar jaar geleden tegenkwam, over het lezen van verwijzingen in c – Clockwise / Spiral Rule

Antwoord

Om te begrijpen wat die (int *) daar doet, is het nuttig om te begrijpen wat malloc (sizeof (int)) aan het doen is. s opsplitsen van rechts naar links.

Ten eerste hebben we een sizeof (int). Dit is een waarde die het aantal bytes vertegenwoordigt dat nodig is om een ​​geheel getal in het geheugen te vertegenwoordigen. Dit kan een 4 zijn of een ander getal, afhankelijk van de computer waarop we “programmeren.

Dus de functie malloc () krijgt eigenlijk een parameter zoals 4, a la malloc (4). Deze functie vraagt ​​de C-bibliotheek om ergens in het geheugen weg te gaan en 4 bytes opzij te zetten (wat precies de juiste grootte heeft om een ​​geheel getal te bevatten).

Nu retourneert de malloc-functie altijd het adres van dat geheugen. Herinner die computer geheugen is serieel ingedeeld, en elk adres in het geheugen is uniek. Malloc () is nu geen erg slimme functie – je vertelt hoeveel geheugen je wilt, en er staat “hier is het”. Het weet niet wat je wilt in dat geheugen stoppen – het weet alleen hoeveel geheugen je hebt gevraagd.

Omdat malloc () niet weet wat je in dat geheugen wilt stoppen, retourneert het een type met de naam (void *), dat wil zeggen een willekeurig geheugenadres, ook wel een pointer genoemd. Op de meeste moderne computers is een adres een 64-bits waarde, die kan worden weergegeven in 8 bytes geheugen, maar computers verschillen r, en verschillende computers kunnen verschillende formaten retourneren. Dus malloc () kan 8 bytes aan gegevens retourneren, in (void *) formaat.

Ten slotte moeten we het geheugen binnengaan dat malloc () ons heeft gegeven, zodat we het kunnen behandelen alsof het een geheel getal. Hoe doen we dat? malloc () gaf ons zojuist een pointer naar een geheugen ergens in de ruimte. We doen dat door de compiler te vertellen dat het geheugenadres dat we hebben teruggekregen van malloc () in werkelijkheid het adres is van een geheel getal. Vandaar je (int *).

Nu je dat allemaal hebt doorlopen, begrijpt de compiler volledig wat je wilde, omdat je de moeite hebt genomen om elke stap te beschrijven: je wilt een acht-byte adres dat verwijst naar een locatie van vier bytes in het geheugen, die op zijn beurt een geheel getal bevat.

En dat is wat die hele uitdrukking betekent!

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *