int (*ptr)(char (*ch)[]); What does the above declaration means? Does it meanptr is pointer to a function that accepts an argument which is array of pointers to characters returning integer?How to evaluate?
4 Réponses :
Cela fonctionne bien dans Oui Considérez la fonction amusante avec le prototype suivant, P> et la pièce de code suivante compilent sans erreur ni avertissement, p> PTR code> est un pointeur de fonction. C'est un pointeur à une fonction renvoyant un entier et acceptant un pointeur sur un tableau de caractères comme argument. p> amusant () code> est une fonction acceptant un pointeur sur un personnage Array comme argument. p>
La question est étiquetée C ++. G ++ ne parvient pas à compiler ce code. Voir: Ideone.com/g7kjpr
PTR est pointeur sur une fonction qui accepte un argument
Comment évaluez-vous la même chose?
Je ne sais pas ce que vous demandez. Pouvez-vous l'expulser différemment?
Je veux dire, comment êtes-vous venu à cette conclusion?
La façon dont vous pensez à cela est la suivante. Pour déclarer un argument de pointeur, omettez d'abord l'étoile et déclarez simplement le type. Dans votre cas, c'est "Char Ch []". Qui est une gamme de caractères. Ensuite, vous ajoutez l'étoile avant le nom. Mais ici, vous devez utiliser des parens, car sinon, cela confondrait le type ("Char" vs "Char Star"). Donc, cela devient "char (étoile ch) []".
"Taille de caractères" n'est pas un type de cible valide pour un pointeur. Vous avez besoin de "tableau de n code> caractères" pour une partie intégrante n code>.
Il y a la règle: http://ieng9.ucsd.edu/~cs30x/rt_lt .rule.html
brièvement, vous devez commencer à partir de l'identifiant, puis analyser tout de l'identifiant à droite (il peut être En d'autres termes, il y a un ordre de precedence em> (qui peut être modifié par des parenthèses), de plus haut à inférieur: p> 1) 2) votre exemple em> p> () code> - la fonction em> ou [] code> tableau em>), puis analyser tout de l'identifiant à gauche. Les parenthèses changent de cette ordonnance - vous devriez d'abord analyser les parenthèses les plus internes, cela fonctionne comme avec des calculs arithmétiques. P> () code> - fonction em> et [] code> [] code> [] > - Array em>, de gauche à droite; p> * code> - pointeur em>, type em> >, type modificateur em>, de droite à gauche. p>
char (* ch )[ ] // (1)ch is (2)a pointer to (3)array of (4)chars
|___| | |_| |_|
4 2 1 3
Comme vous l'avez écrit, Cependant, vous n'êtes pas autorisé à avoir un pointeur sur un tableau sans une liaison sur le tableau. Donc, votre variable est spécifiée de manière incorrecte et ne compilera pas. Il semble que vous souhaitiez normalement, le moyen de simplifier ces types est d'utiliser Toutefois, la nature paramétrée de l'argument de la fonction rend cela plus difficile à atteindre. Assumant C ++ 11, vous pouvez utiliser la construction suivante ( grâce à cette réponse ): p> PTR code> est un pointeur sur une fonction qui renvoie int code> et prend comme argument un pointeur sur un tableau de char Code>. pTR code> d'avoir un type pouvant accepter un pointeur sur une fonction pouvant prendre une matrice de taille. Cela nécessite une construction de gabarits. Pour un argument de fonction, il aurait la forme: p> Typedef code> pour représenter les pièces compliquées , afin que la variable elle-même devienne un pointeur simple à un type de type. Ceci est particulièrement utile lorsque vous essayez d'écrire une fonction qui renvoie un pointeur de fonction. P>
C'était une zone de C que les designers ont été terriblement mals!
Vrai! Il devient difficile d'évaluer de telles expressions ..
Ceci est une erreur de syntaxe.
Laissez-moi CDECL que pour vous ...
@Dyp je ne pense pas, il compile bien l'éditeur VC ++.
@PowerPC HUH, mon CDECL doit être cassé o.o
@PowerPC Je ne pense pas que nous puissions voir MSVC comme bon guide de ce qui est ou n'est pas valide C ++
@Kerreksb vous avez passé autre chose que ce qui est dans la question à CDECL
Les problèmes de CDECL semblent provenir des identifiants
PTR code> etch code>. Utilisez quelque chose d'autre au lieu dePTR code> et laissez de outch code>.CDECL n'autorise-t-il pas à être nommé les paramètres de fonction? Cela devrait être une déclaration valide de
PTR code>, avec l'identifiantch code> efficacement ignoré.Je pense qu'une personne qui écrit ce code n'est pas raisonnable. Veuillez écrire un programme qui a un récit et facile à comprendre. Lorsque vous ne le faites pas, le test de tester votre logiciel est impossible ou difficile.