Чем отличается sizeof массива, указателя и ссылки на массив?

Результаты: 20, 8, 20 и 5. Массив содержит пять int, указатель хранит адрес, а sizeof выражения-ссылки r измеряет сам массив, на который она ссылается.

Короткий ответ

Что ответить на собеседовании

Результаты: 20, 8, 20 и 5. Массив содержит пять int, указатель хранит адрес, а sizeof выражения-ссылки r измеряет сам массив, на который она ссылается.

Подробный разбор

Ответ с пояснениями

Условие

В C++ заданы int a[5]; int* p = a; int (&r)[5] = a;. В рассматриваемой платформе sizeof(int) равно 4, sizeof(int*) равно 8. Что дадут sizeof(a), sizeof(p), sizeof(r) и sizeof(a)/sizeof(a[0])?

Ответ

Результаты: 20, 8, 20 и 5. Массив содержит пять int, указатель хранит адрес, а sizeof выражения-ссылки r измеряет сам массив, на который она ссылается.

В sizeof массив не преобразуется в указатель, поэтому его полный размер сохраняется. Формула количества элементов работает именно для массива в этой области видимости. Параметр функции void f(int a[]) фактически является указателем: внутри неё sizeof(a) уже не определяет размер исходного массива. Для передачи размера используют отдельный аргумент, span или шаблонную ссылку на массив.

Источник: eel.is.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее