Yes, it's "inconsistent", but in the same sense as Java and other languages where objects are passed by reference and primitive data types are passed by value.
There are two major reasons for passing arrays by reference (pointer) rather than by value. Memory efficiency is usually quoted as the primary reason. Indeed, some early implementations of C also passed structs by reference, presumably for that reason.
Another reason for passing arrays by reference is to allow variable length arrays as parameters. The called function has no compiled length for the array, and the array itself has no stored length, so how much of the stack is used for that array, and where does the next argument begin? If you solved the problem with a stored length, then you'd still have a calculation to do to find arguments on the stack after the array. C was designed to be simple and fast--a substitute for assembly for writing an operating system kernel.
I suspect that the second reason is more important, since structs are passed by value in all versions of C since the 1989 ANSI standard. The size of a struct is known to the called function at compile time.
There's some "why" for you. There's also a clue. If you have a fixed-size array you'd like to pass around by value instead of using pointers, wrap it in a struct. I've used that for passing game state information for a board game like checkers or Othello.