In the original K&R, you could not pass structs by value.  That was a syntax error.  Because many compiler vendors offered it as an extension, pass-by-value eventually made its way into the standard.  
Why the restriction, and why the evolution?  The machines that C was developed on were tiny.  Segment sizes of 64 kilobytes were common.  Memory was precious, so why copy something when you could just pass the address?  Duplicating a 64-byte structure on the stack was an error, probably not even what the user intended.  
By the mid-1990s, that wasn't true anymore.  32-bit addressing and RAM of 4 MB or more were common.  The restriction was a hinderance and led to some complexity, because without const a structure passed by reference could be modified, perhaps unwittingly.  
Why not do the same with arrays?  No demand.  Arrays and pointers are closely related in C, as you know.  The C standard library depends heavily on passing by reference, consider memset and strcpy.  Whereas passing a struct by value meant just dropping the & on the call, passing an array by value would have entailed adding new syntax.  A compiler vendor that offered, say, by value as C syntax would have been laughed out of the conference.