bonne manière d'assigner la fonction de pointeur
Je suis un peu confus au sujet de la syntaxe correcte pour l'affectation d'un pointeur de fonction à une
variable. Si j'ai une fonction foo
int foo();
et je suis l'affectation d'un pointeur de foo à barres variable
void * bar;
il ne semble pas grave si j'utilise
bar = foo;
//or
bar = &foo;
Il me semble que seul l'un de ces doit être correcte ou ai-je raté quelque chose?
Ok, donc des pointeurs de fonction sont un cas particulier pour le & de l'opérateur.
Ce qui est intéressant: stackoverflow.com/questions/840501/...
Voilà qui est intéressant. Merci pour votre aide, vous les gars.
Ce qui est intéressant: stackoverflow.com/questions/840501/...
Voilà qui est intéressant. Merci pour votre aide, vous les gars.
OriginalL'auteur Richard Johnson | 2013-03-07
Vous devez vous connecter pour publier un commentaire.
foo
et&foo
valeurs sont l'équivalent en C et ont le même type.La
&
opérateur ici est correcte, mais redondant.Noter que l'affectation d'un pointeur de fonction à une
void *
n'est pas valide en C.(Ce sont en fait des déclarations, mais les contraintes de l'opérateur d'affectation s'applique.)
int (*fp2) = foo;
même compile ..pas de problème :)\pas avec
-Werror
.int (*fp2) = foo;
est réellement invalide C.OK!..pour les 5 minutes, je pensais que vous faites erreur.. mais les peuples ont voté votre réponse et je sais que vous pouvez pas faire d'erreur donc je viens de poster ma réponse au lieu de commenter vous. 🙂
foo
et&foo
ne sont pas équivalents et ne disposent généralement pas du même type. Alors quesizeof(&foo)
est parfaitement valide,sizeof(foo)
ne l'est pas. Vous pourriez penser à des fonctions et des pointeurs vers eux de la même façon que vous traitez les tableaux et les pointeurs de même quelque chose. Dans la plupart expression contextes, les tableaux et les fonctions de "décroissance" pour les pointeurs, les deux exceptions étant lorsque les opérateurs unaires&
etsizeof
sont appliquées.Encore, la déclaration est susceptible d'induire en erreur.
&(foo)
n'est pas le même que&(&foo)
, c'est un autre contexte dans lequel les deux ne sont pas équivalents. Je suppose que techniquement&
n'est pas entièrement évaluer son opérande, car il ne fait pas la chose qu'en C++, est appelé lvalue-rvalue de conversion, et C est appelé à trouver la valeur d'une expression, donc je suppose que techniquement C lvalues ne sont jamais "évalué", car ils ne sont pas vraiment des valeurs. C'est assez beaux cheveux de diviser au lieu de trouver une autre façon de dire ce qui doit être dit à propos de l'expressionfoo
.OriginalL'auteur ouah
Laissez-moi vous expliquer un peu plus.
Ce n'est pas tout à fait correcte comme indiqué par les commentaires de la réponse par @ouah. En particulier:
sizeof(foo)
est pas valide, etsizeof(&foo)
est la taille d'un pointeur.&foo
est le pointeur à toto, tandis que&(&foo)
est pas valide.Cependant, ils sont en fait la même dans tous les autres cas, comme indiqué par la norme de C (référence à l', par exemple, la le projet de C11):
La
sizeof
et unaires&
opérateurs sont les deux seules exceptions lorsqu'une fonction de désignation n'est pas converti en un pointeur.P. S. Vous pouvez également trouver pourquoi
sizeof(foo)
et&(&foo)
est pas valide:OriginalL'auteur Colliot