Airhand, ты попадаешь в ловушку, в которую попадают многие. Причём виноват даже не ты, а современная литература, в 90% которой нет грамотного определения ссылки. Везде пишут "ссылка - это синоним", не давая дополнительных объяснений. И ты повторяешь прочитанное. Если ты не можешь дать корректного определения ссылки, значит ты не понимаешь её сути.
И указатель, и ссылка - это адреса (первый - явный, вторая - неявный). Самое главное отличие ссылки от указателя - это её константная сущность. Вследствии того, что ссылка является константным объектом (именно сама ссылка, а не память, на которую она указывает), то отсюда вытекает несколько известных и не очень известных особенностей ссылки. На самом деле, если отбросить чисто синтаксические отличия между указателем и ссылкой (там *, здесь &, там нужно разыменовывать, здесь не нужно), то указанные ниже особенности составляют полный перечень отличий.
1. Ссылка должна быть явно инициализирована (как и любая другая константная сущность).
2. Ссылка не может быть NULL (на самом деле это можно обойти, но далеко не все компиляторы понимают конструкцию ((T&)NULL), где T - произвольный тип).
3. Ссылку нельзя перенаправить на другой объект (так же, как и любую другу константную сущность).
4. К ссылке не применимы адресные операции (так как хранимый в ссылке адрес константен).
5. Константных ссылок не бывает, хотя бывают ссылки на константные данные (это тоже следствие, так как константная константность - получается тавтология).
Последний пункт немного распишу, чтобы было понятно о чём я говорю. Для поинтеров у нас доступны следующие варианты использования const.
Код: Выделить всё
char * p;
const char * p;
char * const p;
const char * const p;
Думаю, подкованному читателю не затруднит подписать напротив каждой строки, что обозначает каждая из этих записей. Так вот для ссылок последние два варианта следует отбросить, как невозможные. Таким образом из четырёх вариантов остаются только первых два: