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 *);
5 Réponses :
En réalité, la seconde est une gamme de fonctions, non des pointeurs de fonction, et est une erreur de syntaxe selon GCC:
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: et pourrait être utilisé comme suit: p> 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);
}
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: voir WALT W est excellente réponse pour plus d'informations sur les pointeurs de fonction. P> p>
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>
c'est incroyable! Je n'avais aucune idée de cet utilitaire. Merci!
Puisque la syntaxe de C est comme celle de C ++ dans cette affaire, Geordi pourrait être intéressant pour vous. C'est un autre bon outil d'enseignement et d'apprentissage de ces déclarations (et d'autres activités liées à C ++ et parfois, c aussi). comme explication de sa page, il peut faire beaucoup plus, y compris la construction d'un type pour vous p> si vous savez en principe comment Déclarer des choses, mais ne savent pas une seule chose, vous pouvez utiliser des parenthèses: p> Si vous souhaitez voir comment cela ressemble à un identifiant, vous pouvez changer le Type de noms, TOO P> geordi: precedence *x(a, b)
*(x(a, b))
2) devrait être
int (* x [10]) (int, char *, void *); code>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 / ...