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 : 2La 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.
Défi
FacileEntraî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 :
- Définit deux fonctions :
add— prend deux paramètresintet retourne leur sommesubtract— prend deux paramètresintet retourne le premier moins le second
- Dans
main, déclare un pointeur de fonction appelécalcqui peut pointer vers des fonctions prenant deux paramètresintet retournant unint - Lit quatre entrées : deux entiers et deux codes d'opération
- 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
- Assigne la fonction appropriée à
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
5Dans 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 : 2Cela 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;
}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
1Bases de la programmation modulaire
Fichiers d'en-têteGardes d'inclusionFichiers sourcesFonctions statiquesRécapitulatif : Calculatrice modulaire4Encapsulation
Concept des pointeurs opaquesDéfinir des structures opaquesGetters et settersValidation dans les settersRécapitulatif : La boîte secrète7Pointeurs sur fonctions
Déclaration de pointeurs sur fonctionsAppel de pointeurs sur fonctionsTypedef pour les pointeurs sur fonctionsPassage de fonctions en argumentsRécapitulatif : Dispatcher de calculatrice2Objets et méthodes
Structs comme objetsLe pointeur 'Self'Rigueur du mot-clé constPointeur vs ValeurMéthodes utilitairesRécapitulatif : Point Manager5Projet : Compte bancaire simple
Configuration du projetImplémentation du compte8Polymorphisme
Pointeurs de fonctions dans les structuresSimulation de méthodesLe concept d'interfaceImplémentation d'interfacesItération polymorphiqueRécapitulatif : Greeter11Patrons de conception en C
Patron SingletonPatron FabriquePatron ItérateurRécapitulatif : Logger Factory3Cycle de vie des objets
Pattern de constructeurPattern de destructeurInitialisation sur la pileCopie profondeRécapitulatif : String Wrapper6Héritage par composition
Imbrication de structLa règle du premier membreAccès aux membres parentsUpcastingRécapitulatif : Hiérarchie des formes9Projet : Dessinateur de formes
Aperçu du projetImplémentation du cercle