Ссылка — это синоним существующего объекта. Указатель — переменная, хранящая адрес другого объекта.
Основные отличия:
- Инициализация: Ссылки должны быть инициализированы при объявлении и привязаны к существующему объекту. Указатели могут быть объявлены без инициализации (будут иметь неопределенное значение) или с присвоением значения
nullptr.
- Перепривязка: Ссылки нельзя перепривязать к другому объекту после инициализации. Указатели можно изменить, чтобы они указывали на другой объект.
nullptr: Ссылки не могут быть nullptr (обязаны ссылаться на действительный объект). Указатели могут быть nullptr (указывать в никуда).
- Размер: Размер ссылки, как правило, такой же, как у объекта, на который она ссылается (хотя это зависит от реализации компилятора). Размер указателя фиксирован и соответствует размеру адреса в памяти (обычно 4 или 8 байт).
- Разыменование: Указатели требуют явного оператора разыменования (
*) для доступа к значению объекта. Ссылки не требуют явного разыменования, доступ к значению осуществляется напрямую через имя ссылки.
- Арифметика: Над указателями можно выполнять адресную арифметику (сложение/вычитание целых чисел), что позволяет перемещаться по блокам памяти (например, в массивах). Адресная арифметика над ссылками невозможна.
Примеры:
c