Concetti Chiave
- La definizione di una variabile implica l'allocazione di celle di memoria nella RAM, con ogni variabile che ha un indirizzo univoco.
- I puntatori generici, dichiarati come void *, richiedono un casting al tipo desiderato per l'utilizzo, non potendo essere referenziati direttamente.
- Un puntatore può contenere un indirizzo di memoria o NULL, con NULL che rappresenta un indirizzo non accessibile e equivalente a 0 nell'aritmetica dei puntatori.
- È importante specificare il tipo di dato a cui un puntatore si riferisce per garantire la corretta interpretazione della memoria e prevenire comportamenti non definiti.
- La dimensione di un puntatore può essere determinata tramite sizeof(), e non esistono vincoli sul confronto delle dimensioni tra puntatori di tipi diversi.
Definizione e allocazione delle variabili
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:
Puntatori generici e casting
È 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 *).
Indirizzi di memoria e NULL
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
- Qual è la funzione principale di un puntatore in C?
- Cosa sono i puntatori generici e come si utilizzano?
- Qual è il significato della costante NULL in C?
Un puntatore è una variabile che memorizza un indirizzo di memoria, permettendo di accedere al contenuto di una cella di memoria tramite la dereferenziazione (come descritto nel testo).
I puntatori generici, dichiarati come void *, consentono di referenziare variabili di tipo sconosciuto, ma richiedono un casting al tipo desiderato per essere utilizzati correttamente (come spiegato nel testo).
NULL rappresenta un indirizzo di memoria non accessibile e, se un puntatore ha valore NULL, non punta a nulla. In C, NULL e 0 sono equivalenti, e la sua definizione è fornita dalla libreria stdlib.h (come indicato nel testo).