Tutoriel de programmation Linux C Partie 25 – Pointeurs de fonction

Jusqu’à présent, dans cette série de tutoriels de programmation en C, nous avons abordé le concept de base des pointeurs ainsi que plusieurs aspects liés aux pointeurs, comme le pointeur vers un tableau et le tableau de pointeurs. En approfondissant notre compréhension des pointeurs, nous allons aborder dans ce tutoriel le concept des pointeurs de fonctions.

Pointeurs de fonctions en langage de programmation C

Tout comme nous avons des pointeurs vers des variables, il peut aussi y avoir des pointeurs vers des fonctions. Voici un exemple de déclaration d’un pointeur de fonction :

void (*fn_ptr)(int)

Nous avons donc ici un pointeur de fonction nommé ‘fn_ptr’ qui peut pointer vers n’importe quelle fonction qui renvoie void et accepte un entier en entrée. Inutile de préciser qu’il ne s’agit que de la partie déclaration – comme tout autre pointeur, tu dois lui attribuer une adresse (celle d’une fonction dans ce cas) pour l’utiliser.

Voici un exemple d’utilisation de ce pointeur :

#include <stdio.h>

void print_int(int a)
{
printf("\n The integer value is: %d\n",a);
}

int main()
{
void (*fn_ptr)(int);
fn_ptr = &print_int;
(*fn_ptr)(10);

return 0;
}

Comme tu peux le voir, nous avons d’abord défini une fonction ‘print_int’ qui accepte un entier et renvoie void. Ensuite, dans la fonction ‘main’, nous avons déclaré ‘fn_ptr’ comme un pointeur de fonction qui peut pointer vers des fonctions comme ‘print_int’. Ensuite, nous avons attribué l’adresse de la fonction ‘print_int’ à ‘fn_ptr’, et enfin, nous avons fait un appel à la fonction en utilisant le pointeur.

Voici le résultat produit :

The integer value is: 10 

Ce qui vaut la peine d’être mentionné ici, c’est que tu peux encore simplifier ce programme en évitant les & et * des deux dernières lignes. Voici le code modifié :

#include <stdio.h>

void print_int(int a)
{
printf("\n The integer value is: %d\n",a);
}

int main()
{
void (*fn_ptr)(int);
fn_ptr = print_int;
fn_ptr(10);

return 0;

Comme un tableau de pointeurs, tu peux aussi avoir un tableau de pointeurs de fonctions. Par exemple, voici un tableau de pointeurs de fonctions capable de stocker 3 adresses de fonctions.

void (*fn_ptr[3])(int)

Et voici un exemple qui utilise ce tableau de pointeurs :

void print_int1(int a)
{
printf("\n The integer value is: %d\n",a);
}

void print_int2(int a)
{
printf("\n The integer value is: %d\n",a+1);
}

void print_int3(int a)
{
printf("\n The integer value is: %d\n",a+2);
}

int main()
{
void (*fn_ptr[3])(int);

fn_ptr[0] = print_int1;
fn_ptr[1] = print_int2;
fn_ptr[2] = print_int3;

fn_ptr[0](10);
fn_ptr[1](10);
fn_ptr[2](10);

return 0;
}

Voici le résultat produit par ce code :

The integer value is: 10 

The integer value is: 11

The integer value is: 12

Un autre aspect des pointeurs de fonction que tu dois connaître est que tu peux aussi les utiliser comme arguments de fonction. Par exemple, il peut y avoir une fonction qui accepte un pointeur vers une fonction comme argument. Par exemple :

void some_random_func(void (*fn_ptr)(int)) 

Voici un exemple de code qui utilise cette fonction :

#include <stdio.h>

void another_random_func(int a)
{
printf("\n The integer to entered is: %d\n", a);
}

void some_random_func(void (*fn_ptr)(int))
{
fn_ptr(5);
}


int main()
{
some_random_func(another_random_func);
return 0;
}

Ce que nous avons fait ici, c’est que nous avons créé une fonction appelée ‘some_random_func’ qui accepte un pointeur de fonction en entrée. Puis, depuis ‘main’, nous avons appelé ‘some_random_func’ avec l’adresse d’une autre fonction ‘another_random_func’ comme argument. Puis, en utilisant le pointeur, nous avons appelé avec succès ‘another_random_func’.

Voici le résultat :

The integer to entered is: 5 

Conclusion

Les pointeurs de fonction peuvent s’avérer pratiques lorsque tu veux créer ce qu’on appelle un  » mécanisme de rappel  » (tu peux en savoir plus à ce sujet ici). Mais avant d’entrer dans le vif du sujet, il est préférable que tu comprennes bien ce concept. Nous te suggérons d’essayer les exemples de ce tutoriel sur ta machine locale (et aussi d’en créer de nouveaux). En cas de doute ou de question, laisse un commentaire ci-dessous.

Vous aimerez aussi...