This is a kind of asymmetry in the C syntax. It is not possible to pass an array to a function in C, so when you use the array syntax in a function declaration for one of the parameters, the compiler instead reads it as a pointer.
In C, in most cases when you use an array in an expression, the array is implicitly converted to a pointer to its first element, and this is exactly what happens, for example, when you call a function. In the following code:
int bar[] = {1,2,3,4}; foo(bar);
the array is converted to a pointer to the first element, and this is what the function receives.
However, this implication conversion rule does not always apply. As you find, for example, the sizeof operator works with an array, and even the & (address-of) operator works with the original array (i.e. sizeof(*&bar) == 4*sizeof(int) ).
A function in C cannot receive an array as a parameter, it can only receive a pointer to the first element or a pointer to an array ... or you must wrap the array in a structure.
Even if you put a number between the brackets in the function declaration ...
void foo(int x[4]) { ... }
this number is completely ignored by the compiler ... this declaration to the compiler is completely equivalent
void foo(int *x) { ... }
and, for example, even calling it when passing an array with a different size does not cause any error ...
int tooshort[] = {1,2,3}; foo(tooshort);
(in fact, the compiler MAY give a warning, but the code is completely legal C and should be accepted if the compiler follows the standard)
If you think this is a rule about arrays, when it is strange in function arguments, I agree, but this is how the C language is defined.