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.

div class="noprint"style="float: left;"> Valid XHTML 1.0!