Cosa è un puntatore
Un puntatore è una variabile che contiene un indirizzo di memoria. Niente di più, niente di meno.
int x = 42;
int *p = &x; /* p contiene l'indirizzo di x */
printf("%d\n", *p); /* dereferenziazione: stampa 42 */
printf("%p\n", (void*)p); /* stampa l'indirizzo, es. 0x7fff... */
Perché i puntatori esistono
In C, le funzioni ricevono gli argomenti per valore: viene creata una copia. Se vogliamo modificare una variabile dall'interno di una funzione, dobbiamo passare il suo indirizzo.
void incrementa(int *n) {
(*n)++;
}
int main(void) {
int val = 10;
incrementa(&val);
printf("%d\n", val); /* 11 */
return 0;
}
Puntatori e array
In C, il nome di un array decade in un puntatore al suo primo elemento. Questa è una delle cose più importanti da capire:
int arr[5] = {1, 2, 3, 4, 5};
int *p = arr; /* equivalente a &arr[0] */
printf("%d\n", *(p + 2)); /* stampa 3 */
printf("%d\n", p[2]); /* identico */
Conclusione
I puntatori non sono magia oscura: sono la rappresentazione diretta di come il processore vede la memoria. Imparare i puntatori significa capire cosa succede davvero quando il vostro programma gira.