Array C e puntatori hanno legami stretti.
Quando passi un array a una funzione, di fatto passi un puntatore che ha lo stesso nome dell'array.
codice:
void funzione(int* p) {
// p == arr
}
int arr[128];
funzione(arr);
questo si definisce "decadimento" dell'array in puntatore.
La notazione:
codice:
void funzione(int[] p) {
// p == arr
}
è solo un alias della prima versione.
Tuttavia mentre di un puntatore puoi farne quel che vuoi, con l'array non puoi.
codice:
void funzione(int* p) {
// p == arr
p++; // ok, punta ad arr[1];
}
int arr[128];
funzione(arr);
// arr++ errore di compilazione!
int* a = arr;
a++ // ok, a punta ad arr[1]. Altro decadimento di un array C in un puntatore.
In pratica il nome dell'array C è un puntatore const che consente di modificare il contenuto, ma non la locazione a cui punta. Per farlo devi effettuare una indirezione tramite un altro puntatore.
Detto più terra terra, a livello implementativo gli array di per se non esistono: sono puntatori speciali gestiti dal compilatore.