Nel linguaggio C, i parametri in una funzione vengono sempre passati per valore — cioè una copia del valore dal codice chiamante viene passata alla funzione. Se è necessario modificare il valore di una variabile al di fuori della funzione, si utilizza il passaggio per puntatore.
Quando si passa uno scalare (ad esempio, int), la funzione riceve la sua copia:
void foo(int a) { a = 10; } int main() { int x = 5; foo(x); // x == 5, non cambierà! }
Per modificare il valore di una variabile si utilizza un puntatore:
void foo(int* a) { *a = 10; } int main() { int x = 5; foo(&x); // x == 10, valore cambiato! }
È un array un parametro di funzione passato per riferimento?
Molti rispondono "per riferimento", tuttavia in C un array nella firma della funzione non può essere passato per riferimento, essenzialmente degrada a un puntatore.
Risposta corretta:
Quando un array viene passato a una funzione, in realtà viene passato un puntatore al suo primo elemento. Cioè la funzione chiamata non conosce la dimensione reale dell'array, e qualsiasi modifica agli elementi dell'array si riflette sull'array originale.
void foo(int arr[]) { arr[0] = 100; } int main() { int a[3] = {1,2,3}; foo(a); // a[0] sarà 100! }
Storia
int arr[10], ma nel codice chiamante l'array era di dimensioni inferiori. Poiché la funzione non conosceva la dimensione effettiva, si è verificato un overflow del buffer e un danno alla memoria.