После этого комментария я попытался Google почему, но мой Google-фу не удалось.
Комментарий по ссылке:
[...] Но важно то, что массивы и указатели - это разные вещи в C.
Предполагая, что вы не используете какие-либо расширения компилятора, вы, как правило, не можете передать сам массив в функцию, но вы можете передать указатель и проиндексировать указатель, как если бы это был массив.
Вы эффективно жалуетесь, что указатели не имеют длины. Вы должны жаловаться, что массивы нельзя передавать в качестве аргументов функции или что массивы неявно уменьшаются до указателей.
Ответы:
Мое первое предположение по этой причине было просто из-за соображений производительности и экономии памяти, а также из-за простоты реализации компилятора (особенно для компьютеров того времени, когда был изобретен C). Передача огромных массивов «по значению», похоже, оказала огромное влияние на стек, для каждого вызова функции требуется операция полного копирования массива, и, вероятно, компилятор должен быть умнее, чтобы вывести правильный код сборки (хотя последняя точка является дискуссионной) , Также было бы сложнее обрабатывать динамически размещенные массивы так же, как статически размещенные массивы (с точки зрения синтаксиса языка).
EDIT: после прочтения некоторых частей по этой ссылке , я думаю , что реальная причина (и причина , почему массивы структур рассматриваются как типы значений, в то время как единственные массивы не) является обратной совместимостью с C предшественник B . Вот цитата из Денниса Ритчи:
источник
struct Foo { int array[N]; }
может быть передано по значению. И последнее, что касается обработки динамических и статических распределений, кажется одинаково сложным (массив в самом строгом смысле всегда включает размер, объединяющие понятия для таких вещей, как индексация массива, являются указателями в сочетании с затуханием между массивами и указателями), не могли бы вы уточнить?Миникомпьютер PDP с только 8 КБ памяти не может выделить очень большой стек. Таким образом, на такой машине нужно быть осторожным в проектировании (или развитии) языка, чтобы иметь возможность минимизировать то, что нужно поместить в стек для ожидаемого использования общих вызовов подпрограмм. C до сих пор используется для программирования встраиваемых систем с чрезвычайно ограниченным объемом памяти (несколько КБ), поэтому компромисс, как правило, хороший.
В архитектуре процессора, в которой очень мало регистров, передача любого массива по указателю, а не по значению, чаще позволяет использовать регистр в качестве оптимизации вызова подпрограммы.
источник