Concetti Chiave
- I puntatori memorizzano indirizzi di memoria, permettendo di accedere al contenuto tramite dereferenziazione.
- I puntatori generici di tipo void richiedono un cast per essere utilizzati con un tipo specifico, ma non possono essere dereferenziati direttamente.
- Un puntatore può essere NULL, rappresentando un indirizzo di memoria non accessibile, e NULL è equivalente a 0 in C.
- La dimensione di un puntatore può essere determinata con sizeof(), ma non è garantito che puntatori a tipi diversi abbiano dimensioni identiche.
- È cruciale informare il compilatore sul tipo di dato a cui un puntatore si riferisce per evitare comportamenti non definiti.
Puntatori
Una definizione di una variabile comporta l’allocazione di celle di memoria nella RAM, dipendente dal tipo di variabile, quindi ogni variabile ha un indirizzo di memoria univoco. Un puntatore è un tipo di variabile che consente di memorizzare un indirizzo di memoria, riferendosi ad una cella potendo anche accedere al contenuto usando la dereferenziazione del puntatore.
Per dichiarare una variabile puntatore:
È possibile dichiarare puntatori generici, senza specificare il tipo di puntatore, in questo caso:
void *
int x ,*p = &x;
void *q = p;
int *r = q; // r = p
In cui i valori della variabile a cui si fa riferimento non deve cambiare; però non significa che per ogni tipo sizeof(void *) ≥ sizeof(tipo *).
Un puntatore contiene un indirizzo di memoria o NULL. Gli indirizzi di memoria dipendono dalla dimensione dello spazio di indirizzamento della memoria durante il processo. Per ottenere un indirizzo di memori di una cella i deve usare l’operatore &.
La costante NULL è una macro della libreria stdlib.h, rappresenta un indirizzo di memoria non accessibile. Se un puntatore ha come valore NULL, il puntatore non punta a nulla. Secondo il C, NULL e 0 sono equivalenti, quindi nell’ritmetica dei puntatori, lo 0 è convertito automaticamente in NULL.
La macro NULL è definita come: #define NULL ((void*)0) oppure #define NULL 0
È necessario informare il compilatore del tipo di dato a cui il puntatore si riferisce poichè è utile sapere la dimensione della variabile e come interpretare il contenuto della locazione di memoria puntata, se pero l’assegnamento all’indirizzo di memoria non è compatibile, l’accesso al suo contenuto può avere un comportamento non definito e il compilatore avvisa con un warning.
È possibile determinare la dimensione di un puntatore usando sizeof(). Lo standard non impone alcun tipo di vincolo sulla dimensione del tipo di dato e non sempre puntatori a dati di tipo diverso hanno dimensioni uguali/diverse.
Domande da interrogazione
- Che cos'è un puntatore e come funziona in C?
- Qual è il ruolo della costante NULL nei puntatori?
- Come si determina la dimensione di un puntatore e perché è importante?
Un puntatore è una variabile che memorizza un indirizzo di memoria, permettendo di accedere al contenuto della cella di memoria tramite dereferenziazione. In C, i puntatori possono essere dichiarati per diversi tipi di dati e possono anche essere generici usando il tipo void*.
La costante NULL rappresenta un indirizzo di memoria non accessibile. Se un puntatore ha il valore NULL, significa che non punta a nulla. In C, NULL è equivalente a 0, e nella matematica dei puntatori, 0 viene automaticamente convertito in NULL.
La dimensione di un puntatore può essere determinata usando sizeof(). È importante informare il compilatore del tipo di dato a cui il puntatore si riferisce per sapere la dimensione della variabile e interpretare correttamente il contenuto della memoria puntata. Tuttavia, lo standard non impone vincoli sulla dimensione dei tipi di dato, quindi i puntatori a dati di tipo diverso possono avere dimensioni diverse.