Pointeurs de fonction

La fonction appliquer_tableau définie dans appliquer.c est un exemple de fonction appliquant une fonction f à tous les éléments d'un tableau d'entiers. La fonction f est passée en paramètre sous la forme d'un pointeur de fonction. Le type de ce pointeur est int (*)(int). Dans la fonction main, on utilise appliquer_tableau avec comme valeur pour f le pointeur fois_deux.

Plus généralement, si une fonction f retourne une valeur de type t et a pour paramètres des variables de type t1, t2, ..., tk, alors f est une constante de type t (*)(t1, ... tk). Cette constante peut être affectée à une variable comme le montre la deuxième version d'appliquer.c.

Le programme somme_tableau.c montre comment utiliser appliquer_tableau pour calculer la somme des éléments d'un tableau d'entiers à l'aide d'une variable statique.

Les pointeurs de fonctions sont un outil essentiel pour la généricité des programmes. Un exemple en est donné avec les tris.

Noter que l'algorithme utilisé est très simple, mais d'une complexité plus élevée que les meilleurs algorithmes connus.

La première version de la fonction tri trie un tableau d'entiers en ordre croissant.
La deuxième version de tri, qui prend en paramètre une fonction de comparaison, permet d'obtenir facilement un tri croissant, un tri décroissant ou encore une séparation des entiers pairs et impairs.

Les fonctions de la bibliothèque standard
void qsort(void *t, size_t n, size_t s, int (* compare)(const void *, const void *));
et
void *bsearch(const void *x, const void *t, size_t n, size_t s, int (* compare)(const void *, const void *));
permettent respectivement de trier un tableau et de rechercher par dichotomie un élément dans un tableau trié. Dans les deux fonctions,
Le paramètre x de bsearch est une adresse contenant la valeur de l'élément à chercher. bsearch renvoie l'adresse dans le tableau t de l'élément recherché, NULL si aucun élément ne correspond.
Ces fonctions sont illustrées par les programmes tri.c et cherche.c.

Enfin, la dernière version du programme tri.c montre l'utilisation de qsort avec une fonction de comparaison sur une structure représentant des immatriculations. Ces immatriculations sont triées