Мое первое предположение по этой причине было просто из-за соображений производительности и экономии памяти, а также из-за простоты реализации компилятора (особенно для компьютеров того времени, когда был изобретен C). Передача огромных массивов «по значению», похоже, оказала огромное влияние на стек, для каждого вызова функции требуется операция полного копирования массива, и, вероятно, компилятор должен быть умнее, чтобы вывести правильный код сборки (хотя последняя точка является дискуссионной) , Также было бы сложнее обрабатывать динамически размещенные массивы так же, как статически размещенные массивы (с точки зрения синтаксиса языка).
EDIT: после прочтения некоторых частей по этой ссылке , я думаю , что реальная причина (и причина , почему массивы структур рассматриваются как типы значений, в то время как единственные массивы не) является обратной совместимостью с C предшественник B . Вот цитата из Денниса Ритчи:
[...} Решение представляет собой решающий скачок в эволюционной цепочке между типизированным BCPL и типизированным C. Это исключило материализацию указателя в хранилище и вместо этого вызвало создание указателя, когда имя массива упоминается в выражении. Правило, которое сохраняется в сегодняшнем C, заключается в том, что значения типа массива преобразуются, когда они появляются в выражениях, в указатели на первый из объектов, составляющих массив.
Это изобретение позволило большинству существующих B-кодов продолжать работать, несмотря на основополагающий сдвиг в семантике языка. [..]