Transmettre des fonctions
Rappels comme arguments
Transmettre des fonctions est une leçon C Academy gratuite sur CoddyKit. Ceci est la leçon 2 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage C Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours C Academy comprend 4 leçons au total.
Les fonctions comme arguments
Comme un pointeur de fonction n'est qu'une valeur, vous pouvez transmettre une fonction à une autre fonction. La fonction reçue est appelée un rappel.
Cela permet à une routine de personnaliser une partie de son comportement.
#include <stdio.h>
int apply(int x, int (*f)(int)) {
return f(x);
}
int square(int x) { return x * x; }
int main(void) {
printf("%d\n", apply(6, square));
return 0;
}Le paramètre de rappel
Le paramètre de rappel se déclare comme une variable pointeur de fonction. À l'intérieur, vous l'appelez comme n'importe quelle fonction.
#include <stdio.h>
void run_twice(void (*action)(void)) {
action();
action();
}
void beep(void) { printf("beep\n"); }
int main(void) {
run_twice(beep);
return 0;
}Changer le comportement
Transmettez différents rappels pour obtenir des résultats différents avec la même fonction d'ordre supérieur.
#include <stdio.h>
int combine(int a, int b, int (*op)(int, int)) {
return op(a, b);
}
int add(int a, int b) { return a + b; }
int mul(int a, int b) { return a * b; }
int main(void) {
printf("%d\n", combine(3, 4, add));
printf("%d\n", combine(3, 4, mul));
return 0;
}Parcourir un tableau avec map
Une fonction map applique un rappel à chaque élément d'un tableau sur place.
#include <stdio.h>
void map(int *a, int n, int (*f)(int)) {
for (int i = 0; i < n; i++) a[i] = f(a[i]);
}
int inc(int x) { return x + 1; }
int main(void) {
int a[] = {1, 2, 3};
map(a, 3, inc);
for (int i = 0; i < 3; i++) printf("%d ", a[i]);
printf("\n");
return 0;
}Filtrer avec un prédicat
Un prédicat est un rappel qui renvoie vrai ou faux. Utilisez-le pour compter ou sélectionner les éléments correspondants.
#include <stdio.h>
int count_if(int *a, int n, int (*pred)(int)) {
int c = 0;
for (int i = 0; i < n; i++) if (pred(a[i])) c++;
return c;
}
int is_even(int x) { return x % 2 == 0; }
int main(void) {
int a[] = {1,2,3,4,5,6};
printf("%d\n", count_if(a, 6, is_even));
return 0;
}Réduire à une seule valeur
Une fonction de réduction regroupe un tableau en une seule valeur à l'aide d'un rappel binaire et d'un accumulateur initial.
#include <stdio.h>
int reduce(int *a, int n, int init, int (*op)(int,int)) {
int acc = init;
for (int i = 0; i < n; i++) acc = op(acc, a[i]);
return acc;
}
int add(int a, int b) { return a + b; }
int main(void) {
int a[] = {1,2,3,4};
printf("%d\n", reduce(a, 4, 0, add));
return 0;
}Transmettre une comparaison
Le tri et la recherche reçoivent souvent un rappel de comparaison afin que le même algorithme fonctionne avec n'importe quel ordre.
#include <stdio.h>
int max_by(int a, int b, int (*greater)(int,int)) {
return greater(a, b) ? a : b;
}
int gt(int a, int b) { return a > b; }
int main(void) {
printf("%d\n", max_by(3, 8, gt));
return 0;
}typedef pour les types de rappels
Nommer le type de rappel avec typedef rend les signatures de fonctions lisibles.
#include <stdio.h>
typedef int (*IntFn)(int);
int apply(int x, IntFn f) { return f(x); }
int neg(int x) { return -x; }
int main(void) {
printf("%d\n", apply(5, neg));
return 0;
}Rappel de remplacement par défaut
Si un rappel peut être NULL, fournissez un comportement par défaut afin que l'appelant puisse choisir de ne pas l'utiliser.
#include <stdio.h>
int apply(int x, int (*f)(int)) {
if (f == NULL) return x;
return f(x);
}
int dbl(int x) { return x * 2; }
int main(void) {
printf("%d\n", apply(9, NULL));
printf("%d\n", apply(9, dbl));
return 0;
}Les rappels découplent le code
Les rappels permettent à un algorithme général de rester indépendant de l'opération particulière. La bibliothèque fournit la boucle ; vous fournissez le comportement.
#include <stdio.h>
void for_each(int *a, int n, void (*visit)(int)) {
for (int i = 0; i < n; i++) visit(a[i]);
}
void show(int x) { printf("[%d]", x); }
int main(void) {
int a[] = {7, 8, 9};
for_each(a, 3, show);
printf("\n");
return 0;
}Choisir un rappel à l'exécution
Combinez la sélection selon une condition et la transmission : choisissez un rappel, puis transmettez-le à une fonction d'ordre supérieur.
#include <stdio.h>
int apply(int x, int (*f)(int)) { return f(x); }
int sq(int x) { return x * x; }
int cube(int x) { return x * x * x; }
int main(void) {
int power = 3;
int (*f)(int) = (power == 2) ? sq : cube;
printf("%d\n", apply(2, f));
return 0;
}Vérification rapide
Vérifiez votre compréhension de la transmission de fonctions.
Récapitulatif
Vous avez appris à transmettre des fonctions comme rappels :
- Déclarez un paramètre de rappel comme un pointeur de fonction.
- Construisez des fonctions d'ordre supérieur telles que map, filter, reduce et for_each.
- Utilisez
typedefpour nommer les types de rappels. - Prévoyez le cas des rappels
NULLavec une valeur par défaut.
Questions Fréquemment Posées
La leçon « Transmettre des fonctions » est-elle gratuite ?
Oui — le texte complet de « Transmettre des fonctions » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours C Academy, passe à CoddyKit PRO. Le cours C Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Transmettre des fonctions » ?
Rappels comme arguments Tu pratiques C Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer C Academy ?
Aucune expérience préalable n'est requise. C Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 2 sur 4.
Combien de temps prend la leçon « Transmettre des fonctions » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon C Academy ?
Oui. Chaque leçon C Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Déclarer des pointeurs de fonctions
- Transmettre des fonctions
- qsort avec comparateurs
- Tables de pointeurs de fonctions