Il C++ ha introdotto il passaggio di parametri per rifermento o alias tramite l'operatore &.
La confusione deriva dal fatto che & ricava l'indirizzo di una variabile.
L'operatore & usato su un parametro significa passa il riferimento ed è come se passassi il puntatore, cioè non viene fatta una copia locale del parametro.
Passare un puntatore o un riferimento e più rapido, più efficiente. Alle volte non vogliamo modificare il valore, ci basta leggere il contenuto della variabile passata per riferimento o come puntatore, in tal caso si usa anteporre il qualificatore "const", es: (const type &nameVar) o (const type *nameVar).
Ci sono varianti che per essere comprese si devono sperimentare sul pc, es: (type * const nameVar) il puntatore è costante ma il contenuto di nameVar lo posso cambiare senza ricevere errore in fase di compilazione.
Con (const type *nameVar) se provi a cambiare il contenuto della variabile da dentro la funzione ricevi errore in fase di compilazione.
Sono convinto che la difficoltà di comprensione con i puntatore e gli alias deriva dal fatto che non si ha bene chiaro
come è organizzata la RAM, un buon libro C/C++ spiega i puntatori usando delle caselle numerate con indirizzi esadecimali e mostra cosa accade graficamente.
Ciao.