Я знаю, что это относится к ОСНОВАМ, но программисты во всем мире неправильно понимали его на протяжении десятилетий. Это моя попытка прояснить это.

  • Ссылки — это псевдонимы для существующей переменной. Если мы скомпилируем код, мы не получим 2 переменные. ссылка существует только в нашем исходном коде.
  • Ссылка - это именно то, на что это похоже. Это способ сослаться на «существующую переменную», в отличие от указателей, которым можно присвоить значение null. Ссылки всегда должны ссылаться на что-то. И, следовательно, нам не нужно проверять ссылки.
char& ref; //error - references must be initialized
char* p0;  //allowed. No errors.
  • Ссылки не нуждаются в хранении (поскольку это просто никнейм). Они НЕ похожи на вашу типичную переменную.
int a = 5
int *b = &a; 
//creating a pointer. 
//Using & to look at the memory address.
int& ref = a; 
//this and previous lines are actually different. 
//& is used in both cases, however their usage is different.
//int& is a type.
  • Как только вы объявите ссылку, вы не сможете изменить то, на что она ссылается.
int c = 2;
ref = c;
//this will actually set the value of a to 2, and WON'T create a reference to c, as ref already refers a.

Когда использовать ссылку?

  • Используйте ссылку: когда вы знаете, что всегда будет объект, на который можно сослаться, и вы никогда не захотите ссылаться ни на что другое. Подходит для параметров функций и типов возвращаемых значений (делает вид чище).
void increment(int* a){ if(a){ (*a)++; } }
//pointers need validation.
//Hence the 'if' statement.
void increment(int& a){ a++; }
//no need to validate references.
//They will always refer to something.
//both the above functions do the same thing.
//They increment a. 2nd one looks a lot cleaner.

Надеюсь, это прояснит ситуацию!