diff --git a/slides/pointeurs_fonction.md b/slides/pointeurs_fonction.md new file mode 100644 index 0000000000000000000000000000000000000000..8617af06ebe4fe8b98f5e980bd5e972a8282f181 --- /dev/null +++ b/slides/pointeurs_fonction.md @@ -0,0 +1,66 @@ +--- +title: Pointeurs de fonctions +date: 2021-11-16 +--- + +# Pointeurs de fonctions (1/3) + +- Considérons la fonction `max` retournant la valeur maximale d'un tableau + + ```C + int32_t max(int32_t *t, int32_t size) { + int32_t val_max = t[0]; + for (int32_t i = 1; i < size; ++i) { + if (t[i] > val_max) { + val_max = t[i]; + } + } + return val_max; + } + ``` +- L'appel à `max`, retourne l'adresse de la fonction en mémoire. +- On peut affecter cette valeur à un pointeur. + +## Pointeurs de fonctions (2/3) + +- Le type de la fonction `max` est + + ```C + int32_t (*pmax)(int32_t *, int32_t); + ``` +- Le type doit être déclaré avec la signature de la fonction. +- On peut alors utiliser l'un ou l'autre indifféremment + + ```C + int32_t (*pmax)(int32_t *, int32_t); + pmax = max; + int32_t tab[] = {1, 4, -2, 12}; + printf("%d", max(tab, 4)); // retourne 12 + printf("%d", pmax(tab, 4)); // retourne 12 aussi + ``` + +## Pointeurs de fonctions (3/3) + +- On peut passer des fonctions en argument à d'autres fonctions + + ```C + int32_t reduce(int32_t *tab, int32_t size, int32_t init, + int32_t (*red_fun)(int32_t, int32_t)) + { + for (int32_t i = 0; i < size; ++i) { + init = red_fun(init, tab[i]); + } + return init; + } + ``` +- Ici une fonction de *réduction* `sum()`{.C} + + ```C + int32_t sum(int32_t lhs, int32_t rhs) { + return lhs + rhs; + } + int32_t tab[] = {1, 4, -2, 12}; + int32_t red = reduce(tab, 4, 0, sum); + printf("%d", red); // affiche 15 + ``` +