Arrays are the only data types in C and C++ that cannot be passed by value. So an array decays to a pointer to the first element of the array (when declared and passed) as a function parameter.
So basically this:
void test(Animal animal_array2[10])
is actually:
void test(Animal *animal_array2)
but only as function parameter
and the array passed as a parameter:
test(unused_var);
decays to a pointer to the first elem in the array:
test(&(unused_var[0]));
(as a sidenote: but without the actual dereferencing)