Após esse comentário , tentei pesquisar no Google por que, mas meu google-fu falhou.
Comentário do link:
[...] Mas o importante é que matrizes e ponteiros são coisas diferentes em C.
Supondo que você não esteja usando nenhuma extensão do compilador, geralmente não é possível passar um array em si para uma função, mas você pode passar um ponteiro e indexar um ponteiro como se fosse um array.
Você está efetivamente reclamando que os ponteiros não têm comprimento anexado. Você deve reclamar que matrizes não podem ser passadas como argumentos de função ou que matrizes são degradadas em ponteiros implicitamente.
Respostas:
Meu primeiro palpite pelo motivo foi simplesmente por motivos de desempenho e economia de memória e também pela facilidade de implementação do compilador (especialmente para o tipo de computadores no momento em que C foi inventado). A passagem de grandes matrizes "por valor" parecia ter um grande impacto na pilha, ela precisa de uma operação de cópia de matriz completa para cada chamada de função e, provavelmente, o compilador deve ser mais inteligente para produzir o código de montagem correto (embora o último ponto seja discutível) . Também seria mais difícil tratar matrizes alocadas dinamicamente da mesma maneira que matrizes alocadas estaticamente (do ponto de vista da sintaxe do idioma).
EDIT: depois de ler algumas partes a partir deste link , eu acho que a razão real (ea razão pela qual matrizes em estruturas são tratados como tipos de valor, enquanto matrizes únicos não são) é a compatibilidade com versões anteriores ao do C predecessor B . Aqui está a citação de Dennis Ritchie:
fonte
struct Foo { int array[N]; }
pode ser passado por valor. E a última parte sobre o tratamento de alocações dinâmicas e estáticas da mesma forma parece suspeito (uma matriz no sentido mais estrito sempre inclui um tamanho, os conceitos unificadores para coisas como indexação de matrizes são ponteiros associados à deterioração de matriz para ponteiro), você poderia elaborar?Um minicomputador PDP com apenas 8 kB de memória não pode alocar uma pilha muito grande. Portanto, em uma máquina como essa, é preciso ter cuidado em um design de linguagem (ou evolução) para minimizar o que precisa ser colocado na pilha para o uso esperado de chamadas de sub-rotina comum. Atualmente, o C ainda é usado para programar sistemas embarcados com muita restrição de memória (alguns kB), portanto, o trade-off é geralmente bom.
Em uma arquitetura de processador que possui muito poucos registros, passar qualquer matriz por ponteiro, em vez de por valor, com mais frequência permite que um registro seja usado como uma otimização de chamada de sub-rotina.
fonte