void fun(Flight ptr1[],Runway ptr2[])
интерпретируется как
void fun(Flight *ptr1, Runway *ptr2)
Это называется "разложение", и я думаю, что оно гнилое. В основном это функция обратной совместимости с C. Если вам нужны указатели, укажите указатели, а не массивы, потому что указатели и массивы - это разные вещи.
Вы также можете сделать
void fun(Flight (&arr1)[5], Runway (&arr2)[7])
Теперь параметры остаются массивами внутри функции, а не указателями, поэтому ++ arr1
недопустимо и sizeof arr1/sizeof arr1[0]
равно 5
. Массивы аргументов при вызове функции также должны иметь правильный размер, ровно 5 и 7 соответственно. В этом контексте &
означает передачу по ссылке, поэтому массивы не копируются при вызове функции.
Вы также можете использовать систему шаблонов для генерации функции для массива аргументов любого размера:
template< size_t NF, size_t NR >
void fun(Flight (&arr1)[NF], Runway (&arr2)[NR])
Такой шаблон можно вызывать с массивами любого размера, и NF и NR будут целочисленными константами, установленными на соответствующие размеры.