Tout d'abord, certains standardese:
6.7.5.3 Fonction declarators (y compris les prototypes)
...
7 de la déclaration d'Un paramètre comme ‘tableau de type" doit être réglé à ‘qualifié pointeur vers
tapez", où le type de qualificatifs (le cas échéant) sont celles spécifiées dans l' [
et ]
de la
type de tableau de dérivation. Si le mot-clé static
apparaît également au sein de l' [
et ]
de la
type de tableau de dérivation, puis pour chaque appel à la fonction, la valeur du correspondant
argument réel doit fournir l'accès au premier élément d'un tableau avec au moins autant d'
éléments, comme spécifié par la taille de l'expression.
Donc, en bref, tout paramètre de la fonction déclarée T a[]
ou T a[N]
est traitée comme si elle était déclarée T *a
.
Alors, pourquoi sont les paramètres de tableau traitées comme si elles avaient été déclarées comme des pointeurs? Voici pourquoi:
6.3.2.1 Lvalues, les tableaux et les pointeurs de fonction
...
3 Sauf quand c'est l'opérande de l' sizeof
de l'opérateur ou de l'unaire &
de l'opérateur ou d'un
un littéral de chaîne utilisée pour initialiser un tableau, une expression qui a le type ‘tableau de type" est
converti à une expression de type ‘pointeur de type" qui pointe vers le premier élément de
l'objet tableau et n'est pas une lvalue. Si le tableau d'objet a s'inscrire en classe de stockage, le
le comportement est indéfini.
Étant donné le code suivant:
int main(void)
{
int arr[10];
foo(arr);
...
}
Dans l'appel d' foo
, le tableau de l'expression arr
n'est pas un opérande de sizeof
ou &
, de sorte que son type est implicitement converti à partir du "tableau de 10 éléments d' int
" à "pointeur int
", selon 6.2.3.1/3. Ainsi, foo
recevrez une valeur de type pointeur, plutôt qu'un tableau de valeur.
En raison de 6.7.5.3/7, vous pouvez écrire foo
comme
void foo(int a[]) // or int a[10]
{
...
}
mais cela sera interprété comme une
void foo(int *a)
{
...
}
Ainsi, les deux formes sont identiques.
La dernière phrase 6.7.5.3/7 a été introduit avec le C99, et signifie que si vous avez une déclaration de paramètre comme
void foo(int a[static 10])
{
...
}
le paramètre effectif correspondant à l' a
doit être un tableau avec au moins 10 éléments.