econjack:
I disagree. You state:...it is not a reference to the array or a pointer to it. Passing the array name without subscript operators decays the array type to a pointer of its first element, nothing to do with the original array.
Even your own quote says it's a pointer. If it has nothing to do with the original array, then why is the type of the pointer required as part of the parameter being passed? The reason is because pointer operations are scaled to the data type being pointed to. Further, if it has nothing to do with the array, then why is the value passed the lvalue of the array? Indeed, it has everything to do with the array, otherwise the function wouldn't have a memory address to allow any operation to be performed on it. Indeed, if I pass in an array name and pass additional parameters for its length and rank, I can reference the array in a way that matches its original definition.
I'm sorry but you are making wild assumptions here, you can disagree, however you are wrong. It is a pointer to the first element, that is all. You can see this more clearly trying to apply your logic to a multidimensional array. I have showed you in my post above how to pass the actual array by reference or pointer, so I do not see how this is an argument.
Consider this.
int arr[][10] = {{1,2,3,4,5,6},{1,2,3,4,5,6}};
This is wrong, as using an array name without subscript operators does not return a pointer to the array.
int **ptr = arr;
like I've already said it returns a pointer to its first element.
int (*ptr)[10] = arr;
Also an int** of the same data structure would use more memory than the array!