Menu
Coddy logo textTech

Rappel sur les pointeurs void

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

Un void* est la façon dont le langage C dit « un pointeur vers quelque chose, mais je ne vous dis pas quoi ». Il peut contenir l'adresse de n'importe quel type de données — un int, un float, une structure ou n'importe quoi d'autre. Cela en fait le fondement de l'écriture de code générique en C.

Le piège est que vous ne pouvez pas déréférencer un void* directement. Le compilateur ne sait pas combien d'octets lire ni comment les interpréter. Pour utiliser les données, vous devez les transtyper (caster) vers le type correct :

void print_int(void* data) {
    int* p = (int*)data;
    printf("%d\n", *p);
}

int main() {
    int x = 42;
    print_int(&x);
    return 0;
}

Cette flexibilité s'accompagne d'une responsabilité. Si vous effectuez un transtypage vers le mauvais type, le compilateur ne vous arrêtera pas — mais votre programme produira des résultats incohérents ou plantera. C'est pourquoi les fonctions génériques associent souvent un void* à un indicateur de type (comme une énumération ou un drapeau) afin que la fonction sache comment interpréter les données correctement.

Dans les prochaines leçons, vous utiliserez void* pour construire des conteneurs capables de stocker n'importe quel type de données, permettant ainsi de créer des structures de données véritablement réutilisables.

challenge icon

Défi

Facile

Écrivez une fonction appelée print_value qui accepte deux paramètres : un pointeur void* vers des données et un indicateur de type int. La fonction doit interpréter et afficher les données en fonction de l'indicateur de type :

  • Si l'indicateur de type est 0, transtypez le pointeur en int* et affichez la valeur entière
  • Si l'indicateur de type est 1, transtypez le pointeur en float* et affichez la valeur flottante avec 2 décimales

Votre programme recevra deux entrées :

  1. Un indicateur de type (0 pour un entier, 1 pour un flottant)
  2. Une valeur numérique

En fonction de l'indicateur de type, stockez la valeur dans le type de variable approprié, puis appelez print_value avec un pointeur vers cette variable et l'indicateur de type.

Exemple de sortie lorsque les entrées sont 0 et 42 :

42

Exemple de sortie lorsque les entrées sont 1 et 3.14 :

3.14

Exemple de sortie lorsque les entrées sont 0 et -17 :

-17

Exemple de sortie lorsque les entrées sont 1 et 99.5 :

99.50

Aide-mémoire

Un void* est un pointeur générique qui peut contenir l'adresse de n'importe quel type de données. Il offre de la flexibilité pour écrire du code générique en C.

Vous ne pouvez pas déréférencer un void* directement — vous devez d'abord le transtyper vers le type correct :

void print_int(void* data) {
    int* p = (int*)data;
    printf("%d\n", *p);
}

int main() {
    int x = 42;
    print_int(&x);
    return 0;
}

Les fonctions génériques associent souvent un void* à un indicateur de type (comme une énumération ou un drapeau) pour savoir comment interpréter les données correctement. Le transtypage vers le mauvais type peut provoquer un comportement indéfini ou des plantages.

Essayez vous-même

#include <stdio.h>

// À FAIRE : Écrivez votre fonction print_value ici


int main() {
    int type_flag;
    scanf("%d", &type_flag);
    
    if (type_flag == 0) {
        int int_value;
        scanf("%d", &int_value);
        
        // À FAIRE : Appelez print_value avec un pointeur vers int_value et le drapeau de type
        
    } else if (type_flag == 1) {
        float float_value;
        scanf("%f", &float_value);
        
        // À FAIRE : Appelez print_value avec un pointeur vers float_value et le drapeau de type
        
    }
    
    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