В этом случае значение в указателе копируется (хотя это не обязательно так, поскольку оптимизатор может оптимизировать его).
int val = *pPtr;
В этом случае, однако, копия не будет создана:
int& rVal = *pPtr;
Причина, по которой копирование не происходит, заключается в том, что ссылка не является конструкцией уровня машинного кода. Это конструкция более высокого уровня, поэтому компилятор использует ее внутренне, а не генерирует для нее специальный код.
То же самое, очевидно, относится и к параметрам функции.