7
votes

Pointeur de fonction acceptant l'argument

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?

11 commentaires

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 et ch . Utilisez quelque chose d'autre au lieu de PTR et laissez de out ch .


CDECL n'autorise-t-il pas à être nommé les paramètres de fonction? Cela devrait être une déclaration valide de PTR , avec l'identifiant ch 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.


4 Réponses :


1
votes

Cela fonctionne bien dans GCC .

Oui PTR 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.

Considérez la fonction amusante avec le prototype suivant, xxx

amusant () est une fonction acceptant un pointeur sur un personnage Array comme argument.

et la pièce de code suivante compilent sans erreur ni avertissement, xxx


1 commentaires

La question est étiquetée C ++. G ++ ne parvient pas à compiler ce code. Voir: Ideone.com/g7kjpr



4
votes

PTR est pointeur sur une fonction qui accepte un argument qui est un pointeur à un tableau de caractères, retourner entier.


5 commentaires

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 caractères" pour une partie intégrante n .



3
votes

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 () 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>

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) () code> - fonction em> et [] code> [] code> [] > - Array em>, de gauche à droite; p>

2) * code> - pointeur em>, type em> >, type modificateur em>, de droite à gauche. p>


votre exemple em> p>

char  (* ch )[ ]  // (1)ch is (2)a pointer to (3)array of (4)chars
|___|  | |_| |_|
  4    2  1   3


0 commentaires

2
votes

Comme vous l'avez écrit, PTR est un pointeur sur une fonction qui renvoie int et prend comme argument un pointeur sur un tableau de char .

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 pTR 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: xxx

normalement, le moyen de simplifier ces types est d'utiliser Typedef 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. xxx

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 ): xxx < / pré>


0 commentaires