Ссылки появились в C++ как синтаксический сахар над указателями.
Ссылку можно воспринимать как синоним переменной, как другое её имя.
Примеры:
int a = 5;
int &b = a; // объявление ссылки; при объявлении ссылки обязательно задать переменную, на которую она ссылается
printf("%d %d\n", a, b); // выведет 5 5
a = 7;
printf("%d %d\n", a, b); // выведет 7 7
b = 9;
printf("%d %d\n", a, b); // выведет 9 9
void f(int x, int &y){
	printf("%d %d\n", x, y);
	y = x * x; // y — ссылка на внешнюю переменную, её изменения отражаются на переданном аргументе
	printf("%d %d\n", x, y);
	x = 20;  // x — локальная переменная, её изменение видно только внутри функции
	printf("%d %d\n", x, y);
}
int main(){
	int a = 7, b = 9;
	f(a);
	//f выведет:
	//7 9
	//7 49
	//20 49
	
	printf("%d %d\n", a, b); //выведет 7 49
}
В частности, если мы хотим передать большой объект в функцию по ссылке, мы пишем: