Cosa significa (int *) p?


Migliore risposta

(int *) p è un cast di tipo esplicito per il valore memorizzato nella variabile p, al tipo di un puntatore il cui indirizzo punta a un numero intero. Il valore memorizzato da p è un indirizzo di memoria del primo byte dei 4 utilizzati per memorizzare detto intero a 32 bit (4 byte).

Un puntatore memorizza un numero che dovrebbe essere lindirizzo di una posizione specifica in memoria (Heap o Stack). Il tipo di dati archiviati in quella posizione potrebbe essere qualsiasi cosa , e in questa espressione stiamo specificando (o piuttosto assumendo) che sia un numero intero di 4 byte.

Il valore di p può essere modificato prima di essere assegnato a un altro puntatore –

int *c = (int *) p;

Oppure, potrebbe essere dereferenziato per recuperare il valore memorizzato nellindirizzo detenuto da p in questo modo –

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

Oppure, se p è effettivamente un puntatore stesso, potrebbe essere dereferenziato senza di esso essendo esplicitamente tipizzato perché sappiamo che il valore in esso memorizzato è un numero intero di 4 byte.

Per semplicità non ho verificato i puntatori con null. È molto importante controllare che un puntatore sia nullo, perché dereferenziare un puntatore nullo provoca un arresto anomalo.

Esempio di nullo check –

if (p != null)

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

Ora assumendo il lindirizzo è corretto e che il puntatore non è null, e che il tipo di dati archiviato nella posizione di memoria è in realtà un numero intero, la tua console lo stamperà correttamente .

Ecco un articolo dettagliato e ben spiegato che mi sono imbattuto alcuni anni fa, su come leggere i puntatori in c – Regola in senso orario / spirale

Risposta

Per capire cosa ci fa (int *) lì, è utile capire cosa sta facendo malloc (sizeof (int)). “scomponilo da destra a sinistra.

Innanzitutto, abbiamo un sizeof (int). Questo è un valore che rappresenta il numero di byte richiesti per rappresentare un numero intero in memoria. Questo potrebbe essere 4 o qualche altro numero a seconda del computer su cui stiamo “riprogrammando”.

Quindi la funzione malloc () sta effettivamente ottenendo un parametro come 4, a la malloc (4). Questa funzione chiede al Libreria C per uscire da qualche parte in memoria e mettere da parte 4 byte (che sembra essere esattamente la dimensione giusta per contenere un intero).

Ora la funzione malloc restituisce sempre lindirizzo di quella memoria. Ricorda quel computer la memoria è disposta in modo seriale e ogni indirizzo in memoria è unico. Ora malloc () non è una funzione molto intelligente: gli dici quanta memoria vuoi e dice “eccolo”. Non sa “cosa che vuoi mettere in quella memoria – sa solo quanta memoria hai richiesto.

Poiché malloc () non sa cosa vuoi mettere in quella memoria, restituisce un tipo chiamato (void *), ovvero un indirizzo di memoria arbitrario, altrimenti noto come puntatore. Sulla maggior parte dei computer moderni, un indirizzo è un valore a 64 bit, che può essere rappresentato in 8 byte di memoria, ma i computer differiscono re computer diversi possono restituire dimensioni diverse. Quindi malloc () può restituire 8 byte di dati, in formato (void *).

Infine, dobbiamo entrare nella memoria che malloc () ci ha dato, in modo da poterla trattare come contenente un numero intero. Come lo facciamo? malloc () ci ha appena fornito un puntatore a un po di memoria da qualche parte nello spazio. Lo facciamo dicendo al compilatore che lindirizzo di memoria che abbiamo ottenuto da malloc () è in realtà lindirizzo di un numero intero. Da qui il tuo (int *).

Ora che hai fatto tutto questo, il compilatore comprende completamente quello che volevi, perché ti sei preso la briga di descrivere ogni passaggio: vuoi un otto byte indirizzo che punta a una posizione di quattro byte in memoria, che a sua volta contiene un numero intero.

E questo è il significato dellintera espressione!

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *