void ShowData(int(&arr)[], int size);
Эта запись означает передачу ссылки на начало массива, или на весь массив, как параметр?
Или нужно обязательно указывать [size] массива?
Или, как вообще можно корректно передать массив в функцию так, чтобы в нём отразились все изменения?
Достаточно просто использовать указатель:
void ShowData(int *arr, int size);
То же самое можно записать в виде void ShowData(int arr[], int size); и void ShowData(int arr[N], int size);, но результат будет абсолютно такой же: arr будет указателем на int.
Если длина массива известна во время компиляции, тогда можно передавать именно ссылку на массив:
void ShowData(int(&arr)[N]);
Где N - константа времени компиляции. Как вариант, можно сделать N параметром шаблона:
template <std::size_t N> void ShowData(int(&arr)[N]) {/*здесь N - размер массива*/}
Обратите внимание: Если вы выделяли память динамически, и у вас есть не сам массив, а указатель на него, тогда чтобы передать его в int(&arr)[N] потребуется reinterpret_cast.
Причудливая конструкция, которую вы написали:
void ShowData(int(&arr)[], int size);
Дает тот же эффект*, что передача указателя, только интерфейс менее удобный: чтобы передать массив в такую функцию, придется использовать reinterpret_cast<int(&)[]>(массив).
Эта запись означает передачу ссылки на начало массива, или на весь массив, как параметр?
Я так понимаю, ни то, ни другое.
Это ссылка на тип int[], но т.к. он считается incomplete type, переменные в принципе не могут иметь такой тип (в отличие от int[N]). Можно сказать, что вы передаете ссылку на несуществующий int[] с тем же адресом, что и ваш массив.
* Хотя возможно, что доступ к такому параметру приводит к нарушению strict aliasing (типы ведь отличаются) и неопределенному поведению, но нужно проверять стандарт.
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости