Hva betyr (int *) p?


Beste svaret

(int *) p er en eksplisitt type casting for verdien som er lagret i variabelen p, til typen peker hvis adresse peker mot et helt tall. Verdien som p lagrer er en minneadresse for den første byten av de 4 som brukes til å lagre nevnte 32-biters (4 byte) heltall.

En peker lagrer et tall som bør være adressen til et bestemt sted i minnet (Heap eller Stack). Type data som er lagret på dette stedet kan være hva som helst , og i dette uttrykket spesifiserer vi (eller rettere antatt) at det er et 4 byte heltall.

Verdien av p kan typestyres før den blir tildelt en annen peker –

int *c = (int *) p;

Eller det kan bli henvist til å hente verdien som er lagret i adressen som holdes av p som så –

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

Eller, hvis p faktisk er en peker i seg selv, kan den refereres uten den å være eksplisitt typestøpt fordi vi vet at verdien som er lagret i den er et 4 byte heltall.

For enkelhets skyld har jeg ikke nullkontrollert pekerne. Det er viktigst at du ser etter at en peker er null, fordi Dereferanse om en nullpeker resulterer i et krasj.

Eksempel på null sjekk –

if (p != null)

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

Nå forutsatt adressen er riktig og at pekeren ikke er null, og at datatypen som er lagret på minneplasseringen faktisk er et helt tall, vil konsollen skrive den ut riktig .

Her er en detaljert og godt forklart artikkel som jeg kom over for noen år siden, om hvordan jeg kan lese pekere i c – Med klokken / spiralregelen

Svar

For å forstå hva det (int *) gjør der, er det nyttig å forstå hva malloc (sizeof (int)) gjør. La «bryter den ned fra høyre mot venstre.

Først har vi en størrelse på (int). Dette er en verdi som representerer antall byte som kreves for å representere et heltall i minnet. Dette kan være 4 eller et annet tall, avhengig av hvilken datamaskin vi programmerer på.

Så malloc () -funksjonen får faktisk en parameter som 4, a la malloc (4). Denne funksjonen ber C-biblioteket for å gå et sted i minnet og sette av 4 byte (som tilfeldigvis har nøyaktig riktig størrelse for å inneholde et heltall).

Nå returnerer malloc-funksjonen alltid adressen til minnet. minne er lagt ut serielt, og hver adresse i minnet er unik. Nå er malloc () ikke en veldig smart funksjon – du forteller det hvor mye minne du vil ha, og det står «her er det». Det vet ikke hva du vil legge inn det minnet – det vet bare hvor mye minne du ba om.

Fordi malloc () ikke vet hva du vil legge i minnet, returnerer den en type som heter (ugyldig *), det vil si en vilkårlig minneadresse, ellers kjent som en peker. På de fleste moderne datamaskiner er en adresse en 64-biters verdi, som kan representeres i 8 byte minne – men datamaskiner er forskjellige r, og forskjellige datamaskiner kan returnere forskjellige størrelser. Så malloc () kan returnere 8 byte data, i (ugyldig *) format.

Til slutt må vi komme inn i det minnet som malloc () ga oss, slik at vi kan behandle det som å inneholde et heltall. Hvordan gjør vi det? malloc () ga oss bare en pekepinn til noe minne ute i verdensrommet. Vi gjør det ved å fortelle kompilatoren at minneadressen vi fikk tilbake fra malloc () egentlig er adressen til et heltall. Derav din (int *).

Nå har du gått gjennom alt dette, kompilatoren forstår da fullstendig hva du ønsket, fordi du har tatt deg bryet med å beskrive hvert trinn: du vil ha en åtte-byte adresse som peker på en plass på fire byte i minnet, som igjen inneholder et heltall.

Og det er det hele uttrykket betyr!

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *