Ссылки были введены в С++ чтобы избавиться от проблем связанных с использованием указателей. Ссылки позволяют передать в функцию аргумент(ы) по ссылке (без копирования), также как и указатели, но работа в функции с ними ведется как с объектами а не указателями. Фактически ссылка является псевдонимом того объекта, на который она ссылается.
#include<iostream> // std::cout
void val(int a){ // Передача аргумента по значению
a++; // Инкрементирование аргумента
}
void ref(int &a){ // Передача аргумента по ссылке с использованием ссылки
a++; // Инкрементирование аргумента
}
void ptr(int * a){ // Передача аргумента по ссылке с использованием указателя
(*a)++; // Инкрементирование аргумента
}
int main() {
int b = 10; // Аргумент для передачи в функции
val(b); // Передача аргумента по значению . Аргумент не изменяется
std::cout << b << '\n'; // 10
ref(b); // Передача аргумента по ссылке. Аргумент изменяется.
std::cout << b << '\n'; // 11
ptr(&b); // Передача аргумента через указатель. Аргумент изменяется.
std::cout << b << '\n'; // 12
return 0;
}