Menu
Coddy logo textTech

Rappel sur les pointeurs void

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

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

Le problème, c’est que vous ne pouvez pas déréférencer directement un void*. Le compilateur ne sait pas combien d’octets lire ni comment les interpréter. Pour utiliser les données, vous devez les reconvertir 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é implique des responsabilités. Si vous convertissez vers le mauvais type, le compilateur ne vous arrêtera pas, mais votre programme produira des données incohérentes ou plantera. C’est pourquoi les fonctions génériques associent souvent un void* à un indicateur de type (comme une énumération ou un indicateur booléen), afin que la fonction sache interpréter correctement les données.

Dans les prochaines leçons, vous utiliserez void* pour créer des conteneurs capables de stocker n’importe quel type de données, ce qui permettra de véritables structures de données réutilisables.

challenge icon

Défi

Facile

Écrivez une fonction appelée print_value qui accepte deux paramètres : un pointeur void* vers les 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, convertissez le pointeur en int* et affichez la valeur entière
  • Si l’indicateur de type est 1, convertissez 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 nombre 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

Essayez vous-même

#include <stdio.h>

// TODO: É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);
        
        // TODO: Appelez print_value avec un pointeur vers int_value et le flag de type
        
    } else if (type_flag == 1) {
        float float_value;
        scanf("%f", &float_value);
        
        // TODO: Appelez print_value avec un pointeur vers float_value et le flag 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 Programmation Orientée Objet

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