Сначала немного standardese :
6.7.5.3 Объявление функций (включая прототипы)
...
7 Объявление параметра в виде массива type ’должно быть скорректировано, чтобы указывать квалифицированный указатель на
type ’’, где квалификаторы типа (если таковые имеются) - это те, которые указаны в [
и ]
вывод типа массива. Если ключевое слово static
также присутствует в пределах [
и ]
вывод типа массива, затем для каждого вызова функции значение соответствующего
фактический аргумент должен обеспечивать доступ к первому элементу массива с как минимум
элементы, как указано в выражении размера.
Короче говоря, любой параметр функции, объявленный как T a[]
или T a[N]
, обрабатывается , как если бы было объявлено T *a
.
Итак, почему параметры массива обрабатываются так, как если бы они были объявлены как указатели? И вот почему:
6.3.2.1 L-значения, массивы и функциональные обозначения
...
3 За исключением случаев, когда это операнд оператора sizeof
или унарный оператор &
, или
строковый литерал, используемый для инициализации массива, выражение, которое имеет тип ‘‘ array of type ’’
преобразуется в выражение с указателем типа ‘‘ на тип ’, которое указывает на начальный элемент
объект массива и не является lvalue. Если объект массива имеет класс хранения регистров,
поведение не определено.
С учетом следующего кода:
int main(void)
{
int arr[10];
foo(arr);
...
}
При вызове foo
выражение массива arr
не является операндом sizeof
или &
, поэтому его тип неявно преобразуется из "массива из 10 элементов int
" в «указатель на int
» согласно 6.2.3.1/3. Таким образом, foo
получит значение указателя, а не значение массива.
Из-за 6.7.5.3/7 вы можете написать foo
как
void foo(int a[]) // or int a[10]
{
...
}
но это будет интерпретироваться как
void foo(int *a)
{
...
}
Таким образом, две формы идентичны.
Последнее предложение в 6.7.5.3/7 было введено с C99 и в основном означает, что если у вас есть объявление параметра, например
void foo(int a[static 10])
{
...
}
фактический параметр, соответствующий a
, должен быть массивом с не менее 10 элементов.