Результаты: 20, 8, 20 и 5. Массив содержит пять int, указатель хранит адрес, а sizeof выражения-ссылки r измеряет сам массив, на который она ссылается.
Чем отличается sizeof массива, указателя и ссылки на массив?
Результаты: 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.