Menu
Coddy logo textTech

Appel de pointeurs sur fonctions

Fait partie de la section Object Oriented Programming du Journey C de Coddy — leçon 34 sur 61.

Maintenant que vous savez comment déclarer un pointeur de fonction et lui assigner une fonction, la prochaine étape consiste à appeler réellement la fonction via ce pointeur.

La syntaxe est simple — vous utilisez le pointeur de fonction tout comme vous appelleriez une fonction classique :

int add(int a, int b) {
    return a + b;
}

int main() {
    int (*operation)(int, int) = add;
    
    int result = operation(5, 3);  // Appelle add(5, 3)
    printf("%d\n", result);        // Sortie : 8
    return 0;
}

Écrivez simplement le nom du pointeur suivi de parenthèses contenant les arguments. C déréférence automatiquement le pointeur et exécute la fonction vers laquelle il pointe.

Vous pouvez également utiliser la syntaxe de déréférencement explicite avec (*operation)(5, 3), mais c'est facultatif et moins courant. Les deux formes produisent des résultats identiques.

La véritable puissance se manifeste lorsque vous réassignez le pointeur à différentes fonctions :

int subtract(int a, int b) {
    return a - b;
}

operation = subtract;
result = operation(5, 3);  // Appelle maintenant subtract(5, 3)
printf("%d\n", result);    // Résultat : 2

La même variable operation exécute maintenant une logique complètement différente. Cette capacité à échanger le comportement au moment de l'exécution est le fondement du polymorphisme en C.

challenge icon

Défi

Facile

Entraînons-nous à appeler des fonctions via des pointeurs et à changer quelle fonction est exécutée. Vous allez construire une calculatrice simple capable de basculer entre l'addition et la soustraction au moment de l'exécution.

Écrivez un programme qui :

  1. Définit deux fonctions :
    • add — prend deux paramètres int et retourne leur somme
    • subtract — prend deux paramètres int et retourne le premier moins le second
  2. Dans main, déclare un pointeur de fonction appelé calc qui peut pointer vers des fonctions prenant deux paramètres int et retournant un int
  3. Lit quatre entrées : deux entiers et deux codes d'opération
  4. Pour chaque code d'opération :
    • Assigne la fonction appropriée à calc (1 pour add, 2 pour subtract)
    • Appelle la fonction via le pointeur avec les deux nombres
    • Affiche le résultat

Vous recevrez quatre entrées : le premier nombre, le second nombre, le premier code d'opération (1 ou 2), et le second code d'opération (1 ou 2).

Votre sortie doit afficher deux résultats sur des lignes séparées — un pour chaque opération effectuée en utilisant les deux mêmes nombres :

15
5

Dans cet exemple, avec les entrées 10, 5, 1, 2 : la première opération (code 1) additionne 10 + 5 = 15, puis le pointeur est réassigné, et la seconde opération (code 2) soustrait 10 - 5 = 5.

Cela démontre comment la même variable pointeur peut exécuter une logique complètement différente en la réassignant entre les appels.

Aide-mémoire

Pour appeler une fonction via un pointeur, utilisez le nom du pointeur suivi de parenthèses contenant les arguments :

int add(int a, int b) {
    return a + b;
}

int main() {
    int (*operation)(int, int) = add;
    
    int result = operation(5, 3);  // Appelle add(5, 3)
    printf("%d\n", result);        // Sortie : 8
    return 0;
}

Vous pouvez également utiliser la syntaxe de déréférencement explicite (*operation)(5, 3), mais elle est facultative.

Les pointeurs de fonction peuvent être réassignés pour pointer vers différentes fonctions au moment de l'exécution :

int subtract(int a, int b) {
    return a - b;
}

operation = subtract;
result = operation(5, 3);  // Appelle maintenant subtract(5, 3)
printf("%d\n", result);    // Sortie : 2

Cela permet à la même variable pointeur d'exécuter une logique différente en la réassignant entre les appels.

Essayez vous-même

#include <stdio.h>

// TODO: Définir la fonction add ici


// TODO: Définir la fonction subtract ici


int main() {
    // Lire les entrées
    int num1, num2, op1, op2;
    scanf("%d", &num1);
    scanf("%d", &num2);
    scanf("%d", &op1);
    scanf("%d", &op2);
    
    // TODO: Déclarer un pointeur de fonction nommé 'calc' qui peut pointer vers
    // des fonctions prenant deux paramètres int et retournant un int
    
    
    // TODO: Pour le premier code d'opération (op1) :
    // - Assigner la fonction appropriée à calc (1 pour add, 2 pour subtract)
    // - Appeler la fonction via le pointeur et afficher le résultat
    
    
    // TODO: Pour le second code d'opération (op2) :
    // - Réassigner calc à la fonction appropriée
    // - Appeler la fonction via le pointeur et afficher le résultat
    
    
    return 0;
}
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Object Oriented Programming