Innanzitutto ritengo sia opportuno chiarire la seguente peculiarità del linguaggio ideato da K&R:
in C esiste solo il passaggio per valore. I parametri formali sostanzialmente sono una copia dei parametri attuali e qualsiasi modifica ad parametro formale, in C, non si riflette sul parametro attuale. Ciò è dimostrato dal seguente frammento di codice:
#include <stdio.h>
#include <stdlib.h>
static int f(int a);
int main(void)
{
int x = 10;
int
y = f(x);
printf("x = %d y = %d\n", x,y);
return (EXIT_SUCCESS);
}
static int f(int a)
{
++a;
return a;
}
Come si nota lanciando l'eseguibile prodotto dalla compilazione del codice di cui sopra ,
x parametro attuale, non subisce alcuna modifica contrariamente a quanto avviene per
a, parametro formale.
Se si vuole passare l'indirizzo di una variabile occorre fare uso di un
puntatore, un tipo particolare di variabile che serve appunto a memorizzare indirizzi. Passando un puntatore ad una funzione, però, si passa
una copia del puntatore, pertanto sarà sì possibile cambiare il valore della variabile puntata dal puntatore, ma non sarà mai possibile modificare il puntatore riflettendo il cambiamento al di fuori del contesto della funzione senza ricorrere ai puntatori di puntatori. Perciò si può dire definitivamente che non esiste il passaggio per riferimento in C.
Naturalmente non è esiste nemmeno il passaggio per valore-risultato, caratteristica disponibile solo in alcuni linguaggi tra cui, se non erro, Fortran e Ada. Nel passaggio per valore-risultato le modifiche al parametro formale si riflettono
automaticamente sul parametro attuale al termine della funzione.