Después de este comentario , intenté buscar en Google por qué, pero mi google-fu falló.
Comentario del enlace:
[...] Pero lo importante es que las matrices y los punteros son cosas diferentes en C.
Suponiendo que no está utilizando ninguna extensión del compilador, generalmente no puede pasar una matriz a una función, pero puede pasar un puntero e indexar un puntero como si fuera una matriz.
Te estás quejando efectivamente de que los punteros no tienen una longitud adjunta. Debería quejarse de que las matrices no se pueden pasar como argumentos de función, o que las matrices se degradan a punteros implícitamente.
Respuestas:
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:
fuente
struct Foo { int array[N]; }
se puede pasar por valor. Y lo último sobre tratar las asignaciones dinámicas y estáticas de la misma manera parece sospechoso (una matriz en el sentido más estricto siempre incluye un tamaño, los conceptos unificadores para cosas como la indexación de matriz son punteros junto con la descomposición de matriz a puntero), ¿podría elaborar?Una minicomputadora PDP con solo 8 kB de memoria no puede asignar una pila muy grande. Por lo tanto, en una máquina de este tipo, se debe tener cuidado en el diseño (o evolución) del lenguaje para poder minimizar lo que se necesita en la pila para el uso de llamadas de subrutina común esperado. C todavía se usa hoy para programar sistemas embebidos extremadamente limitados de memoria (unos pocos KB), por lo que la compensación suele ser buena.
En una arquitectura de procesador que tiene muy pocos registros, pasar cualquier matriz por puntero en lugar de por valor con mayor frecuencia permite que un registro se use como una optimización de llamada de subrutina.
fuente