"Jesse what the fuck are you talking about"
void purr(int n, int arr[]);
void purr(int n, int arr[*]);
void purr(int n, int arr[static 1]);
void purr(int n, int arr[n]);
void purr(int n, int arr[static n]);
void purr(int n, int arr[1]);
void purr(int n, int* arr);
These are all identical, compatible declarations. That means all of these are just a fancy way of passing a pointer to a function, modulo your compiler implementer giving an iota of a damn and doing some type checking for you.
That means if you wanted to use ANY of the above syntaxes for anything else, the minute you tried to use it for a parameter it would once again become a pointer. Not just at the API level because of C's rules, but the ABI level.
It means you have to choose a sufficiently fucked up notation if you wanted to get built-in language spans or a built-in "any VLA" type, forcing C to choose weirder things just to have syntax for something actually useful and not just a shitty compiler hint.