11. Pointeurs de fonction
Une fonction en C n'est pas une variable. Cependant on peut accéder à son adresse et manipuler des pointeurs de fonction.
Déclaration
Voici trois exemples de pointeurs de fonction :
int (*pf1) (void);
pf1
pointe sur une fonction qui a int
pour
type de retour et qui n'a pas de paramètres.
double (*pf2) (double, double);
pf2
pointe sur une fonction qui renvoie un double
et qui a deux double
en paramètres.
void (*pf3) ();
pf3
pointe sur une fonction qui ne renvoie rien. On
ne connait pas les paramètres de la fonction (cela vient de
l'ancienne formulation des fonctions en C).
Remarque : Dans la définition du pointeur de fonction, le parenthèsage est obligatoire (la priorité de l'opérateur * est trop faible).
Prenons par exemple, la fonction suivante :
double max (double a, double b) {
return (a>b)? a:b;
}
On associe pointeur de fonction et fonction comme cela : (les deux lignes sont équivalentes)
pf2 = max /* forme la plus portable */
pf2 = &max; /* forme la plus "cohérente" */
Maintenant (*pf2)(10.5,21.0);
, pf2(10.5,21.0)
et max(10.5,21.0);
donnent le même résultat.
La forme avec * est préconisée : la deuxième forme
est plus difficile à repérer en cas d'erreur car on ne voit
pas directement qu'il s'agit d'un pointeur, sauf si le nom est explicite.
Tableau de pointeurs
On se donne N+1 fonctions fn : de fn0 à fnn. On peut définir le tableau de pointeurs de fonction tabptrfn de deux manières :
int (*tabptrfn[N+1]) ();
tabptrfn[0] = &fn0;
...
tabptrfn[N] = &fnN;
ou alors :
int (*tabptrfn[]) () = {&fn0, &fn1, &fn2, ... , &fnn};
Le code suivant:
switch (choix) {
case 0 : fn0();
break;
case 1 : fn1();
break;
...
}
est avantageusement remplacé par l'une des trois lignes suivantes :
(*tabptrfn[choix])();
tabptrfn[choix]();
(**(tab+choix))();
Prototype d'une fonction qui a pour paramètre un pointeur de fonction ..
void appliquer (double, double, double (*)(double, double));
void appliquer (double a, double b, double (*pf) (double, double));
Définition d'un typedef :
typedef void (*NOM_TYPE) (int, int)
TD : programmation d'une calculatrice avec un tableau de pointeurs de fonction.