8
votes

Pointeur mixte, tableau et déclarations de type de fonction en C

Un de mes amis essayait de me tester sur C (ma langue la plus forte est C ++) et il m'a demandé trois questions que je ne pouvais pas répondre:

Essayez d'expliquer les déclarations suivantes: P>

1) int (*x)(int, char *, void *);
2) int (*x[10])(int, char *, void *);
3) int (**x[10])(int, char *, void *);

c

4 commentaires

2) devrait être int (* x [10]) (int, char *, void *);


Le premier est un pointeur de fonction. La seconde que je ne sais pas. Et le troisième est un pointeur sur un pointeur de ce que c'est le second.


@nmuntz, vous avez dit que vous l'avez réparé, mais vous ne semblez pas avoir. Laissez-moi m'occuper de cela pour vous '.


Référence croisée: Stackoverflow.com/questions/ 89056 / ...


5 Réponses :


7
votes
  1. Un pointeur de fonction
  2. Un tableau de pointes de fonction
  3. Un tableau de pointeurs pour fonctionner les pointeurs

1 commentaires

En réalité, la seconde est une gamme de fonctions, non des pointeurs de fonction, et est une erreur de syntaxe selon GCC: : 1: erreur: déclaration de 'x' comme une matrice de fonctions



21
votes

Eh bien, le premier est un pointeur sur une fonction. En d'autres termes, il déclare une variable "X" qui pointe une fonction du type suivant: xxx pré>

et pourrait être utilisé comme suit: p> xxx pré >

La seconde semble être une syntaxe invalide, mais je peux me tromper. S'il y avait un astérisque avant le x (tel que INT (* x [10]) (int, char *, vide *)), il s'agirait d'une gamme de pointeurs de fonction et serait utilisée comme une matrice normale: P>

void anothercaller() {
    int (*x)(int, char*, void*);
    int (**y)(int, char*, void*);
    x = myfunc;
    y = &x;
    (*y)(1, "hello", 0);
}


0 commentaires

6
votes

Ce sont des pointeurs de la fonction, comme indiqué ci-dessus, mais écrit plutôt obnoxieusement (à mon avis). La façon dont je voudrais les écrire est la suivante: xxx

voir WALT W est excellente réponse pour plus d'informations sur les pointeurs de fonction.


0 commentaires

31
votes

Vous avez besoin du CDECL code > programme, qui vous donnera une réponse définitive et correcte à de telles questions. Apprendre à interpréter de telles déclarations manuellement est faisable et bénéfique, mais même si CDECL est extrêmement utile pour vérifier si vous avez une réponse correcte.

prompt>cdecl
Type `help' or `?' for help
cdecl> explain int (*x)(int, char *, void *);
declare x as pointer to function (int, pointer to char, pointer to void) returning int
cdecl> explain int (*x[10])(int, char *, void *);
declare x as array 10 of pointer to function (int, pointer to char, pointer to void) returning int
cdecl> explain int (**x[10])(int, char *, void *);
declare x as array 10 of pointer to pointer to function (int, pointer to char, pointer to void) returning int
cdecl>


1 commentaires

c'est incroyable! Je n'avais aucune idée de cet utilitaire. Merci!