The function signatures are the same.
You may check this out by naming all functions with one name.
void f1(int *a) {}
void f1(int a[]) {}
void f1(int a[3]) {}
Your compiler will throw a compile error saying something like "redefinition of void f1(int *)". Now notice this, if you rearrange functions as following:
void f1(int a[3]) {}
void f1(int a[]) {}
void f1(int *a) {}
You will get the same error message about "redefinition of void f1(int *)", not of "void f1(int a[3])". It is because in C++ there's only a way to pass a pointer to an array and function arguments that look like arrays are just syntax ease to pass pointers.
Also check this out: Why do C and C++ compilers allow array lengths in function signatures when they're never enforced?