Sia per valore che per indirizzo, per valore viene passata una copia esatta del valore, per indirizzo viene passata una copia del valore del puntatore, cioè l'indirizzo a cui punta.
Infatti nello scope della funzione f() x cambierà indirizzo, puntando ai dati di y, ma per la funzione chiamante x punterà sempre ai dati della variabile a.
Invece nella chiamata per riferimento (&) è possibile modificare sia l'indirizzo del puntatore che i dati a cui punta.
Saluti.