Menu
Coddy logo textTech

Déclaration de pointeurs sur fonctions

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

Jusqu'à présent, nous avons appris à simuler l'héritage en utilisant l'imbrication 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 : les pointeurs de fonction (function pointers).

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

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

int (*operation)(int, int);

Ceci déclare une variable called operation that can point vers n'importe quelle function that prend two int parameters et renvoie un int. Les parenthèses autour de *operation sont cruciales — sans elles, vous déclareriez une function that renvoie un pointer.

Pour assign une function à ce pointer, utilisez simplement le nom de la function (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 function sert d'adresse. Vous pouvez aussi utiliser &add explicitement, mais c'est optionnel — les deux formes sont équivalentes en C.

challenge icon

Défi

Facile

Pratiquons la déclaration des pointeurs de fonction et l'assignation de fonctions à ceux-ci. Vous allez créer un système d'opérations mathématiques simple où 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 retournant un int
  3. Lit trois entrées : deux entiers et un code d'opération (1 pour multiply, 2 pour subtract)
  4. En fonction du code d'opération, assigne la fonction appropriée à votre pointeur operation
  5. Affiche le nom de l'opération assignée, puis affiche le résultat de l'appel de la fonction via le pointeur

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

Votre sortie doit ressembler à ceci :

Operation: multiply
Result: 35

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

Rappelez-vous : 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 de paramètres. Pour assigner une fonction, utilisez simplement le nom de la fonction 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 retournant 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 Object Oriented Programming