Hvad betyder (int *) p?


Bedste svar

(int *) p er en eksplicit type casting for den værdi, der er gemt i variablen p, til typen af ​​en markør, hvis adresse peger på et heltal. Den værdi, som p gemmer, er en hukommelsesadresse for den første byte af de 4, der bruges til at lagre det 32 ​​bit (4 byte) heltal.

En markør lagrer et tal, der skal være adressen til et bestemt sted i hukommelsen (Heap eller Stack). Typen af ​​data, der er gemt på det sted, kan være hvad som helst , og i dette udtryk specificerer vi (eller rettere antages), at det er et 4 byte heltal.

Værdien af ​​p kan typestyres, før den tildeles til en anden markør –

int *c = (int *) p;

Eller det kan blive henvist til at hente den værdi, der er gemt i den adresse, der holdes af p som sådan –

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

Eller, hvis p faktisk er en markør i sig selv, kunne den blive henvist uden den bliver eksplicit typestyret, fordi vi ved, at værdien, der er gemt i det, er et 4 byte heltal.

For enkelheds skyld har jeg ikke nulstillet markeringerne. Det er meget vigtigt, at du kontrollerer, om en markør er nul, fordi derferference om en nulmarkør resulterer i et nedbrud.

Eksempel på en nul check –

if (p != null)

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

Antager vi nu adresse er korrekt, og at markøren ikke er null, og at datatypen, der er gemt i hukommelsesplaceringen, faktisk er et heltal, din konsol vil udskrive den korrekt .

Her er en detaljeret og velklaret artikel, som jeg stødte på for et par år siden, om hvordan man læser markører i c – Med uret / Spiralregel

Svar

For at forstå, hvad det (int *) gør der, er det nyttigt at forstå, hvad malloc (sizeof (int)) gør. Lad “nedbryder det fra højre mod venstre.

Først har vi en størrelse på (int). Dette er en værdi, der repræsenterer det antal bytes, der kræves for at repræsentere et heltal i hukommelsen. Dette kan være 4 eller et andet nummer, afhængigt af hvilken computer vi programmerer på.

Så malloc () -funktionen får faktisk en parameter som 4, a la malloc (4). Denne funktion beder C-bibliotek for at gå et sted i hukommelsen og afsætte 4 bytes (hvilket tilfældigvis er nøjagtigt i den rigtige størrelse til at indeholde et heltal).

Nu returnerer malloc-funktionen altid adressen på den hukommelse. Husk den computer hukommelse er anbragt serielt, og hver adresse i hukommelsen er unik. Nu er malloc () ikke en meget smart funktion – du fortæller det, hvor meget hukommelse du vil have, og det siger “her er det”. Det ved ikke hvad du vil lægge i den hukommelse – den ved kun, hvor meget hukommelse du har bedt om.

Fordi malloc () ikke ved, hvad du vil lægge i den hukommelse, returnerer den en type kaldet (ugyldig *), det vil sige en vilkårlig hukommelsesadresse, ellers kendt som en pointer. På de fleste moderne computere er en adresse en 64-bit værdi, som kan repræsenteres i 8 byte hukommelse – men computere er forskellige r, og forskellige computere kan returnere forskellige størrelser. Så malloc () kan returnere 8 byte data i (ugyldigt *) format.

Endelig er vi nødt til at komme ind i den hukommelse, som malloc () gav os, så vi kan behandle det som indeholdende en heltal. Hvordan gør vi det? malloc () gav os bare en markør til noget hukommelse ude i rummet et eller andet sted. Vi gør det ved at fortælle kompilatoren, at den hukommelsesadresse, vi fik tilbage fra malloc (), virkelig er adressen på et heltal. Derfor din (int *).

Nu er du gået igennem alt det, compileren forstår derefter fuldt ud, hvad du ville, fordi du har brugt dig til at beskrive hvert trin: du vil have en otte byte adresse, der peger på en firebyteplacering i hukommelsen, som igen indeholder et heltal.

Og det betyder det hele udtrykket!

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *