If you have an array as parameter ( a[] ) the argument passed would fill that array. Using the pointer ( *a ) the parameter would be pointing to the location of the array passed as argument without knowing the size of it
So... yes, there is essentially no difference when used as parameters. And, there are no methods to get the length of the array -- you must provide some method of determining the length. The two most common methods are to explicitly pass the length as an additional argument, or to require the array data to be terminated with some semaphore value (like a null in strings).
AFIAK there is no semantic difference whatsoever between those two function prototypes. So the only difference is stylistic. It's probably more logical to use * as a pointer to a single thing and [] for actual arrays. The seeming exception here is that C-style strings are usually passed as char* even though they are actually char arrays, but that's probably because people think of a string as a single thing. The classic example of that kind of thinking is char *argv[], suggesting a single-dimensional array of strings whereas it is "actually" a (ragged) two-dimensional array of chars. Of course it can also be char **argv, but note it cannot be char argv[][X] because there is no fixed number to give to X. That's why it's a ragged array in this case.