Puntatori in C: la guida fondamentale

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.