Ce înseamnă (int *) p?


Cel mai bun răspuns

(int *) p este un casting de tip explicit pentru valoarea stocată în variabila p, la tipul unui pointer a cărui adresă indică un număr întreg. Valoarea pe care o stochează p este o adresă de memorie a primului octet din cei 4 care sunt utilizați pentru a stoca numarul întreg de 32 de biți (4 octeți).

Un indicator stochează un număr care ar trebui să fie adresa unei anumite locații din memorie (Heap sau Stack). Tipul de date stocate în acea locație ar putea fi orice și, în această expresie, specificăm (sau mai degrabă presupunem) că este un număr întreg de 4 octeți.

Valoarea lui p poate fi tipografiată înainte de a fi atribuită unui alt indicator –

int *c = (int *) p;

Sau, ar putea fi dereferențiat pentru a recupera valoarea stocată în adresa deținută de p ca atare –

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

Sau, dacă p într-adevăr este un pointer în sine, ar putea fi dereferențiat fără el fiind explicit tipografiat deoarece știm că valoarea stocată în acesta este un număr întreg de 4 octeți.

Pentru simplitate, nu am verificat nule indicatorii. Este cel mai important să verificați dacă un indicator este nul, deoarece dereferențierea unui indicator null are ca rezultat un blocaj.

Exemplu de nul verificați –

if (p != null)

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

Presupunând acum adresa este corectă și că indicatorul nu este nul, și că tipul de date stocat în locația memoriei este de fapt un număr întreg, consola dvs. îl va imprima corect .

Iată un articol detaliat și bine explicat pe care l-am întâlnit acum câțiva ani, despre cum să citiți indicii în c – în sensul acelor de ceasornic / regulă spirală

Răspuns

Pentru a înțelege ce face asta (int *) acolo, este util să înțelegeți ce face malloc (sizeof (int)). Să „o descompunem de la dreapta la stânga.

În primul rând, avem o dimensiune (int). Aceasta este o valoare care reprezintă numărul de octeți necesari pentru a reprezenta un număr întreg în memorie. Acesta ar putea fi 4 sau un alt număr, în funcție de computerul pe care îl programăm.

Deci funcția malloc () primește de fapt un parametru precum 4, a la malloc (4). Această funcție cere Biblioteca C pentru a ieși undeva în memorie și a pune deoparte 4 octeți (ceea ce se întâmplă să fie exact de dimensiunea potrivită pentru a conține un număr întreg).

Acum funcția malloc returnează întotdeauna adresa memoriei respective. Reamintim computerul memoria este așezată în serie și fiecare adresă din memorie este unică. Acum malloc () nu este o funcție foarte inteligentă – îi spui câtă memorie vrei și spune „aici este”. Nu știe ce doriți să introduceți memoria respectivă – știe doar câtă memorie ați solicitat.

Deoarece malloc () nu știe ce doriți să puneți în memoria respectivă, returnează un tip numit (void *), adică o adresă de memorie arbitrară, altfel cunoscută sub numele de pointer. Pe majoritatea computerelor moderne, o adresă este o valoare pe 64 de biți, care poate fi reprezentată în 8 octeți de memorie – dar computerele diferă r și diferite computere pot reveni la dimensiuni diferite. Deci, malloc () poate returna 8 octeți de date, în format (void *).

În cele din urmă, trebuie să intrăm în memoria respectivă pe care malloc () ne-a dat-o, astfel încât să o putem trata ca conținând o întreg. Cum facem asta? malloc () tocmai ne-a dat un pointer către o memorie în spațiu undeva. Facem asta spunând compilatorului că adresa de memorie pe care am primit-o din malloc () este într-adevăr adresa unui număr întreg. Prin urmare, dvs. (int *).

Acum ați trecut prin toate acestea, compilatorul înțelege pe deplin ce ați dorit, pentru că v-ați luat problema să descrieți fiecare pas: doriți un octet de opt adresa care indică o locație de patru octeți în memorie, care la rândul său conține un număr întreg.

Și „ceea ce înseamnă întreaga expresie!

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *