Primeiro, alguns padrões :
6.7.5.3 Declaradores de função (incluindo protótipos)
...
7 Uma declaração de um parâmetro como '' array do tipo '' deve ser ajustada para '' ponteiro qualificado para
tipo '', onde os qualificadores de tipo (se houver) são aqueles especificados dentro de [
e ]
da derivação de tipo de matriz. Se a palavra-chave static
também aparecer dentro de [
e ]
da derivação do tipo de matriz, então para cada chamada para a função, o valor do argumento real correspondente deve fornecer acesso ao primeiro elemento de uma matriz com pelo menos tantos elementos quanto especificado pelo tamanho expressão.
Portanto, em resumo, qualquer parâmetro de função declarado como T a[]
ou T a[N]
é tratado como se tivesse sido declarado T *a
.
Então, por que os parâmetros de array são tratados como se fossem declarados como ponteiros? Aqui está o porquê:
6.3.2.1 Valores L, matrizes e designadores de função
...
3 Exceto quando é o operando do sizeof
operador ou o &
operador unário , ou é um literal de string usado para inicializar uma matriz, uma expressão que tem o tipo '' matriz do tipo ' 'é convertido em uma expressão com tipo' 'ponteiro para tipo ' 'que aponta para o elemento inicial do objeto de matriz e não é um lvalue. Se o objeto de matriz tiver classe de armazenamento de registro, o comportamento é indefinido.
Dado o seguinte código:
int main(void)
{
int arr[10];
foo(arr);
...
}
Na chamada para foo
, a expressão de array arr
não é um operando de sizeof
ou &
, então seu tipo é convertido implicitamente de "array de 10 elementos de int
" para "ponteiro para int
" de acordo com 6.2.3.1/3. Portanto, foo
receberá um valor de ponteiro, em vez de um valor de array.
Por causa de 6.7.5.3/7, você pode escrever foo
como
void foo(int a[]) // or int a[10]
{
...
}
mas será interpretado como
void foo(int *a)
{
...
}
Assim, as duas formas são idênticas.
A última frase em 6.7.5.3/7 foi introduzida com C99 e basicamente significa que se você tiver uma declaração de parâmetro como
void foo(int a[static 10])
{
...
}
o parâmetro real correspondente a a
deve ser uma matriz com pelo menos 10 elementos.