33 votes

Paramètre "[*]" d'une fonction

Lors de l'utilisation de Longueur variable Tableau en paramètre à la fonction

int sum(int n, int a[n]);

il est facile de comprendre en premier paramètre(n) spécifie la longueur de la deuxième paramètre(a). Mais a rencontré avec un autre prototype utilisé pour VLAs en paramètre

int sum(int n, int a[*]);

est vraiment difficile de comprendre pourquoi * est utilisé à la place de n à l'intérieur d' []?

48voto

AndreyT Points 139512

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".

4voto

aaronman Points 8034

Lorsque vous mettez l'étoile dans une fonction réelle, il donne cette erreur test.c:3: error: ‘[*]' not allowed in other than function prototype scope. Après quelques recherches, c'est en fait une façon de déclarer un VLA un prototype de fonction, avec l' * à la place du nom de la variable. VLA.
Le problème ici est que si vous mettez une variable à la place de l'étoile pour un VLA, il vous dira qu'il est non déclaré, si la star est une façon que c99 intégré à contourner.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X