As far as I can remember, the first versions of C only allowed to return a value that could fit into a processor register, which means that you could only return a pointer to a struct. The same restriction applied to function arguments.
More recent versions allow to pass around larger data objects like structs. I think this feature was already common during the eighties or early nineties.
Arrays, however, can still be passed and returned only as pointers.