Menu
Coddy logo textTech

Riepilogo dei puntatori void

Fa parte della sezione Programmazione orientata agli oggetti del percorso C di Coddy. Lezione 49 di 61.

Un void* è il modo in cui C dice «un puntatore a qualcosa, ma non ti dico a cosa». Può contenere l’indirizzo di qualsiasi tipo di dato: un int, un float, una struct o qualsiasi altra cosa. Questo lo rende il fondamento per scrivere codice generico in C.

Il problema è che non puoi dereferenziare direttamente un void*. Il compilatore non sa quanti byte leggere né come interpretarli. Per usare i dati, devi convertirlo di nuovo nel tipo corretto:

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

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

Questa flessibilità comporta delle responsabilità. Se lo converti nel tipo sbagliato, il compilatore non te lo impedirà, ma il tuo programma produrrà risultati senza senso o andrà in crash. Per questo le funzioni generiche spesso abbinano un void* a un indicatore di tipo (come un enum o un flag), così la funzione sa come interpretare correttamente i dati.

Nelle prossime lezioni, userai void* per creare contenitori in grado di memorizzare dati di qualsiasi tipo, realizzando strutture dati davvero riutilizzabili.

challenge icon

Sfida

Facile

Scrivi una funzione chiamata print_value che accetti due parametri: un puntatore void* ai dati e un flag di tipo int. La funzione deve interpretare e stampare i dati in base al flag di tipo:

  • Se il flag di tipo è 0, converti il puntatore in int* e stampa il valore intero
  • Se il flag di tipo è 1, converti il puntatore in float* e stampa il valore float con 2 cifre decimali

Il tuo programma riceverà due input:

  1. Un flag di tipo (0 per intero, 1 per float)
  2. Un valore numerico

In base al flag di tipo, memorizza il valore nel tipo di variabile appropriato, quindi chiama print_value con un puntatore a quella variabile e il flag di tipo.

Esempio di output quando gli input sono 0 e 42:

42

Esempio di output quando gli input sono 1 e 3.14:

3.14

Esempio di output quando gli input sono 0 e -17:

-17

Esempio di output quando gli input sono 1 e 99.5:

99.50

Provalo tu

#include <stdio.h>

// TODO: Scrivi qui la funzione print_value


int main() {
    int type_flag;
    scanf("%d", &type_flag);
    
    if (type_flag == 0) {
        int int_value;
        scanf("%d", &int_value);
        
        // TODO: Chiama print_value con un puntatore a int_value e l'indicatore del tipo
        
    } else if (type_flag == 1) {
        float float_value;
        scanf("%f", &float_value);
        
        // TODO: Chiama print_value con un puntatore a float_value e l'indicatore del tipo
        
    }
    
    return 0;
}
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Compilatore C online