36 votes

Quelle est l'utilisation de plusieurs astérisques dans l'appel de fonction?

Je ne vois aucune utilisation pratique de plusieurs astérisques dans l'appel de fonction:

 void foo(int a, char b)
{

}

int main(void)
{
    (**************foo)(45, 'c');

    //or with pointer to function:
    void (*ptr)(int, char) = foo;
    (******ptr)(32, 'a');
}
 

Pourquoi cette chose est-elle autorisée à la fois en C et en C ++?

42voto

Mike Seymour Points 130519

L'un des conversions standard, en C et en C++, la fonction de pointeur de la conversion; quand un nom de fonction apparaît dans une expression, il peut être converti en un pointeur sur cette fonction. Donc:

  • foo est équivalent à &foo
  • *foo est équivalent à *(&foo)ou foo
  • **foo est eqivalent d' **(&foo)ou *fooou foo

et ainsi de suite.

Cela signifie que vous pouvez légalement ajouter autant d' * que vous le souhaitez avant le nom d'une fonction sans en changer le sens. Il n'y a pas de raison de le faire.

39voto

cnicutar Points 98451

Pourquoi est-ce une chose qui a permis à la fois en C et C++?

Je ne peux pas parler pour le C++, mais pour C au moins une fonction de désignation, est converti en un pointeur:

6.3.2.1 - 4

Une fonction de désignation est une expression qui a la fonction de type. Sauf quand il est l'opérande de l'opérateur sizeof ou unaire & de l'opérateur, une fonction de désignation de type ‘fonction de retour de type" est converti à une expression de type ‘pointeur de fonction de retour de type".

L'application de l'opérateur d'indirection génère une fonction de désignation:

6.5.3.2 - 3

Unaire * l'opérateur indique l'indirection. Si l'opérande de points pour un la fonction, le résultat est une fonction de désignation

Donc, peu importe combien de fois vous appliquer l'opérateur d'indirection vous obtiendrez la même chose: une fonction de désignation qui est immédiatement converti en pointeur.


À mon avis il y a peu ou pas d'utiliser pour ce faire.

9voto

Parce que l' * de l'opérateur s'attend à une valeur de l'adresse. Et à chaque fois qu'une valeur est attendue (par opposition à un objet ou une fonction glvalue), la lvalue à rvalue, la fonction de pointeur et un tableau de pointeur de conversions sont appliquées sur un opérande. Ainsi, le déréférencé fonction immédiatement de nouveau convertit un pointeur de quand de nouveau déréférencé.

Tous ces soit lire des valeurs à partir d'objets ou de produire une valeur de type pointeur qui fait référence au début d'un tableau ou d'une fonction, respectivement.

Ces lignes de déréférence n'ont d'autre objectif que pour le lulz d'elle.

-4voto

Siem Abera Points 251

La façon dont je le comprends est

 * is a pointer to a memory address
& is the value at the Memory address

*foo means pointer to foo memory address
**foo means *(*foo) *(foo memory address) This is a different value from *foo
 

ça continue comme ça ...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X