Menu
Coddy logo textTech

Déclaration de pointeurs sur fonctions

Fait partie de la section Programmation Orientée Objet du Journey C de Coddy. Leçon 33 sur 61.

Jusqu'à présent, nous avons appris à simuler l'héritage à l'aide de l'intégration de structures. Mais le véritable polymorphisme, où différents objets répondent différemment au même appel, nécessite quelque chose de plus : des pointeurs de fonction.

Un pointeur de fonction est une variable qui stocke l’adresse d’une fonction. Tout comme un pointeur classique contient l’adresse de données, un pointeur de fonction contient l’adresse de code exécutable.

La syntaxe peut sembler intimidante au début. Pour déclarer un pointeur de fonction, vous indiquez le type de retour, puis le nom du pointeur entre parenthèses avec un astérisque, suivi des types des paramètres :

int (*operation)(int, int);

Cela déclare une variable appelée operation qui peut pointer vers n’importe quelle fonction prenant deux paramètres int et renvoyant un int. Les parenthèses autour de *operation sont essentielles : sans elles, vous déclareriez une fonction qui renvoie un pointeur.

Pour affecter une fonction à ce pointeur, utilisez simplement le nom de la fonction (sans parenthèses) :

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

int (*operation)(int, int);
operation = add;  // Maintenant operation pointe vers add

Le nom de la fonction sert d’adresse. Vous pouvez également utiliser &add explicitement, mais c’est facultatif : les deux formes sont équivalentes en C.

challenge icon

Défi

Facile

Entraînons-nous à déclarer des pointeurs de fonction et à leur affecter des fonctions. Vous allez créer un système simple d’opérations mathématiques dans lequel un pointeur de fonction peut contenir différentes fonctions arithmétiques.

Écrivez un programme qui :

  1. Définit deux fonctions :
    • multiply : prend deux paramètres int et renvoie leur produit
    • subtract : prend deux paramètres int et renvoie le premier moins le second
  2. Dans main, déclare une variable pointeur de fonction appelée operation qui peut pointer vers des fonctions prenant deux paramètres int et renvoyant un int
  3. Lit trois entrées : deux entiers et un code d’opération (1 pour la multiplication, 2 pour la soustraction)
  4. En fonction du code d’opération, affecte la fonction appropriée à votre pointeur operation
  5. Affiche le nom de l’opération affectée, puis affiche le résultat de l’appel de la fonction via le pointeur

Vous recevrez trois entrées : le premier nombre, le deuxième nombre et le code d’opération (1 ou 2).

Votre sortie devrait ressembler à ceci :

Operation: multiply
Result: 35

multiply est le nom de l’opération (ou subtract si le code vaut 2), et 35 est le résultat de l’appel de la fonction via votre pointeur (dans ce cas, 5 × 7).

N’oubliez pas : pour déclarer le pointeur de fonction, vous avez besoin du type de retour, du nom du pointeur entre parenthèses avec un astérisque et des types des paramètres. Pour affecter une fonction, utilisez simplement son nom sans parenthèses.

Essayez vous-même

#include <stdio.h>

// TODO: Définir la fonction multiply ici


// TODO: Définir la fonction subtract ici


int main() {
    int num1, num2, code;
    
    // Lire l'entrée
    scanf("%d", &num1);
    scanf("%d", &num2);
    scanf("%d", &code);
    
    // TODO: Déclarer un pointeur de fonction appelé 'operation' qui peut pointer vers
    // des fonctions prenant deux paramètres int et renvoyant un int
    
    
    // TODO: En fonction du code d'opération (1 pour multiply, 2 pour subtract),
    // assigner la fonction appropriée à votre pointeur operation
    
    
    // TODO: Afficher le nom de l'opération et le résultat
    // Format :
    // Operation: <name>
    // Result: <result>
    
    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 Programmation Orientée Objet

Entraînez-vous par vous-même : Compilateur C en ligne