Mi primera suposición por la razón fue simplemente por razones de rendimiento y ahorro de memoria, y también por la facilidad de implementación del compilador (especialmente para el tipo de computadoras en el momento en que se inventó C). Pasar grandes matrices "por valor" parecía tener un gran impacto en la pila, necesita una operación de copia de matriz completa para cada llamada de función, y probablemente el compilador debe ser más inteligente para generar el código de ensamblaje correcto (aunque el último punto es discutible) . También sería más difícil tratar las matrices asignadas dinámicamente de la misma manera que las matrices asignadas estáticamente (desde el punto de vista de la sintaxis del lenguaje).
EDIT: después de leer algunas partes de este enlace , creo que la verdadera razón (y la razón por la cual las matrices de estructuras son tratados como los tipos de valor, mientras que las matrices únicos no lo son) es la compatibilidad con versiones anteriores de C a B predecesor . Aquí está la cita de Dennis Ritchie:
[...} La solución constituyó el salto crucial en la cadena evolutiva entre BCPL sin tipo y tipo C. Eliminó la materialización del puntero en el almacenamiento, y en su lugar causó la creación del puntero cuando el nombre de la matriz se menciona en una expresión. La regla, que sobrevive en la C de hoy, es que los valores del tipo de matriz se convierten, cuando aparecen en expresiones, en punteros al primero de los objetos que forman la matriz.
Esta invención permitió que la mayoría del código B existente continuara funcionando, a pesar del cambio subyacente en la semántica del lenguaje. [..]