L' [*]
syntaxe est destiné à être utilisé lors de la déclaration des prototypes de fonction. Le détail clé ici est que, en fonction des prototypes vous n'êtes pas tenu de nommer vos paramètres, il vous suffit de spécifier le type de chaque paramètre.
Dans votre exemple, si vous laissez le premier paramètre sans nom, alors évidemment, vous ne serez pas en mesure d'utiliser n
dans le deuxième tableau) paramètre déclaration. Pourtant, dans de nombreux cas, vous devez indiquer au compilateur que certains paramètre est un VLA. C'est lorsque l' [*]
de la syntaxe vient à la rescousse.
Dans votre cas, si vous omettez le paramètre noms, le prototype pourrait regarder comme
int sum(int, int [*]);
Cependant, il est important de noter que, dans votre exemple précis de cette syntaxe est légal, mais il n'est pas vraiment nécessaire. Tout comme avec les non-VLA des tableaux, un int [n]
paramètre est toujours équivalent à int *
paramètre (même pour les non-constante n
). Cela signifie que vous pouvez simplement prototype de ta fonction
int sum(int, int []);
ou comme
int sum(int, int *);
et le prototype sera encore servir son but, c'est à dire qu'il va bien correspondre à la définition de la fonction. En d'autres termes, VLA les propriétés d'un paramètre déclaré comme un tableau 1D sont tout à fait négligeable et l' [*]
fonctionnalité n'est pas vraiment nécessaire, avec de tels VLA les tableaux.
L' [*]
devient important dans les situations où la variable "arrayness" le type n'est pas perdu, comme ce serait le cas 2D, VLA (ou un pointeur vers un VLA). E. g. une fonction définie comme
int sum2d(int n, int m, int a[n][m])
{
...
}
peut-être prototypée les suivantes
int sum2d(int, int, int a[*][*]);
int sum2d(int n, int, int a[n][*]);
int sum2d(int, int m, int a[*][m]);
int sum2d(int n, int m, int a[n][m]);
Tous ces prototypes correctement correspondre à la définition de la fonction.
Bien sûr, si vous avez l'habitude de toujours nommer tous les paramètres dans les prototypes de fonction, alors vous ne serez jamais besoin de cette [*]
de la syntaxe, puisque vous serez en mesure d'utiliser le dernier prototype dans la liste ci-dessus.
P. S. Encore une fois, comme c'est le cas avec tous les tableaux en paramètre déclarations, le premier []
est toujours sans conséquences et toujours se désintègre à un pointeur, ce qui signifie que les éléments suivants sont également valables équivalent prototype de déclarations pour les ci-dessus sum2d
int sum2d(int, int, int a[][*]);
int sum2d(int, int, int (*a)[*]);
int sum2d(int n, int m, int (*a)[m]);
C'est le deuxième []
ce qui importe vraiment, et doit être déclaré comme "de longueur variable".