In realtà non vengono passati i puntatori ma si parla di "passaggio dei parametri per indirizzo", in opposizione al passaggio per valore.

In pratica in C si può decidere di far sì che una funzione possa cambiare il valore di una variabile ad essa passata come parametro per indirizzo. Se il parametro viene passato per valore, invece, la funzione inserisce nello stack una copia della variabile, la utilizza per il suo scope (il campo di visibilità della funzione) e poi se ne libera.

In C++ invece c'è una possibilità aggiuntiva per passare i parametri per indirizzo: dichiarare un parametro <type>&.
Ad esempio:

codice:
void cambiaX (int &x)
{
  x = 12;
}
Imposta il valore della variabile passata come parametro a 12, e tale valore persiste anche all'uscita dalla funzione perchè si è intervenuto direttamente sulla locazione in memoria del dato.

Se invece avessi scritto

codice:
void cambiaX (int x)
{
  x = 12;
}
La funzione avrebbe creato una copia della variabile e all'uscita dalla funzione il parametro avrebbe lo stesso valore che aveva in ingresso.