0Pricing
C Academy · Leçon

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 typedef pour nommer les types de rappels.
  • Prévoyez le cas des rappels NULL avec 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

  1. Déclarer des pointeurs de fonctions
  2. Transmettre des fonctions
  3. qsort avec comparateurs
  4. Tables de pointeurs de fonctions
← Retour à C Academy