Специально провёл эксперимент:
1. Пишем две аналогичных программы: одна с использованием указателей, другая - ссылок.
ptr.cpp#include <iostream>
using namespace std;
void foo(int* x) {*x = 7;}
int main(int argc, char** argv)
{
int x = 0;
foo(&x);
cout << x << endl;
return 0;
}
ref.cpp#include <iostream>
using namespace std;
void foo(int& x) {x = 7;}
int main(int argc, char** argv)
{
int x = 0;
foo(x);
cout << x << endl;
return 0;
}
2. Компилируем в ассемблерный код.
g++ -S ptr.cpp
g++ -S ref.cpp
3. Проверяем, есть ли разница.
diff ptr.s ref.s
У меня linux, gcc 5.3.0. Файлы отличаются только именами функций (Z3fooRi у ссылок, Z3fooPi у указателей). То есть, в данном случае действительно нет разницы между ссылками и указателями.
P. S. Этот эксперимент показывает лишь то, что нет разницы между передачей по ссылке и по указателю. В случае, который указали в других ответах, разница есть.