Другие ответы уже объясняют проблему. Я хочу предложить изменить практику кодирования.
Использование void hoo(int* &p, int n)
в качестве объявления функции очень старый стиль. Используя шаблоны, вы можете позволить компилятору определять размер и получать ссылку на массив, что устраняет необходимость использования указателя.
template <size_t N>
void hoo( int (&p)[N]) // The argument is a reference to an array of N elements.
{
for (int i = 0; i < N; i++)
cout << p[i] << endl;
}
Вызов функции становится естественным.
int array[] = { 1,2,3,4,5 };
hoo(array);
Если ваша функция также должна поддерживать динамически размещаемые массивы, вы можете перегрузить функцию следующим образом.
void hoo(int* p, size_t N)
{
for (int i = 0; i < N; i++)
cout << p[i] << endl;
}
template <size_t N>
void hoo( int (&p)[N]) // The argument is a reference to an array of N elements.
{
hoo(p, N);
}