В чем разница между ссылкой и указателем

«В чем разница между ссылкой и указателем» — вопрос из категории Управление памятью, который задают на 24% собеседований Android Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Ссылки и указатели в C++ (и аналогично в Java/Kotlin для объектов) имеют ключевые отличия:

  1. Инициализация:
    Ссылка обязана быть инициализирована при объявлении и не может быть null, указатель может быть nullptr (или null в Java/Kotlin).

  2. Переприсваивание:
    Ссылку нельзя перенаправить на другой объект после инициализации, указатель — можно.

  3. Синтаксис:
    Указатели используют * и ->, ссылки работают как обычные переменные (.).

Пример (C++):

int a = 5;
int& ref = a;  // ссылка
int* ptr = &a; // указатель

ref = 10;      // a = 10
*ptr = 20;     // a = 20
ptr = nullptr; // допустимо
// ref = nullptr; // ошибка!

В Java/Kotlin все переменные объектов — ссылки (но с возможностью null), примитивы хранятся по значению.