Вот соответствующие разделы стандарта языка C (вы запросили C, вот что вы получите):
6.3.2.1 L-значения, массивы и обозначения функций
...
3 За исключением случаев, когда это операнд оператора sizeof или унарный оператор &, или
строковый литерал, используемый для инициализации массива, выражение, которое имеет тип ‘‘ array of type ’’
преобразуется в выражение с указателем типа 101 ‘на тип ’, которое указывает на начальный элемент
объект массива и не является lvalue. Если объект массива имеет класс хранения регистров,
поведение не определено.
...
6.5.2.1 Массив подписки
Ограничения
1 Одно из выражений должно иметь тип ‘‘ указатель на объект тип ’’, другое выражение должно
имеют целочисленный тип, а результат имеет тип ‘‘ type ’’.
Семантика
2 Выражение с постфиксом, за которым следует выражение в квадратных скобках []
обозначение элемента объекта массива. Определение индекса оператора []
является то, что E1[E2]
идентичен (*((E1)+(E2)))
. Из-за правил преобразования, которые
применяется к бинарному оператору +
, если E1
является объектом массива (эквивалентно указателю на
начальный элемент объекта массива) и E2
является целым числом, E1[E2]
обозначает E2
элемент E1
(считая с нуля).
...
6.7.5.3 Объявления функций (включая прототипы)
...
7 Объявление параметра в виде массива type ’должно быть скорректировано, чтобы указывать квалифицированный указатель на
type ’’, где квалификаторы типа (если таковые имеются) указаны в [
и ]
вывод типа массива. Если ключевое слово static
также присутствует в пределах [
и ]
вывод типа массива, затем для каждого вызова функции значение соответствующего
фактический аргумент должен обеспечивать доступ к первому элементу массива с как минимум
элементы, указанные в выражении размера
Важно отметить, что между объектом (в смысле C, который занимает память) и выражением, которое мы используем для ссылки на этот объект, есть разница. Массивы всегда являются массивами, но выражение , используемое для ссылки на этот объект, часто будет иметь тип указателя.