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.
Sfida
FacileScrivi 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 inint*e stampa il valore intero - Se il flag di tipo è
1, converti il puntatore infloat*e stampa il valore float con 2 cifre decimali
Il tuo programma riceverà due input:
- Un flag di tipo (
0per intero,1per float) - 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:
42Esempio di output quando gli input sono 1 e 3.14:
3.14Esempio di output quando gli input sono 0 e -17:
-17Esempio di output quando gli input sono 1 e 99.5:
99.50Provalo 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;
}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
1Basi di programmazione modulare
File di intestazioneGuardie di inclusioneFile sorgenteFunzioni staticheRipasso: calcolatrice modulare4Incapsulamento
Il concetto di puntatori opachiDefinire struct opacheGetter e setterLa convalida nei setterRiepilogo: scatola segreta7Puntatori a funzione
Dichiarare puntatori a funzioneChiamare i puntatori a funzioneTypedef per puntatori a funzionePassare funzioni come argomentiRiepilogo: dispatch della calcolatrice10Contenitori generici
Riepilogo dei puntatori voidWrapper genericoScambio genericoConfronto genericoRiepilogo: array generico2Oggetti e metodi
Le struct come oggettiIl puntatore 'Self'Correttezza constPuntatore o valoreMetodi di supportoRiepilogo: gestore di punti5Progetto: Conto bancario semplice
Configurazione del progettoImplementazione del conto8Polimorfismo
Puntatori a funzione nelle structSimulare i metodiIl concetto di interfacciaImplementare le interfacceIterazione polimorficaRiepilogo: Greeter11Pattern di progettazione in C
Pattern SingletonPattern FactoryPattern IteratorRiepilogo: Factory di Logger3Ciclo di vita degli oggetti
Pattern del costruttorePattern del distruttoreInizializzazione sullo stackCopia profondaRiepilogo: wrapper di stringhe6Ereditarietà tramite composizione
Incorporamento delle structLa regola del primo membroAccesso ai membri della classe baseUpcastingRiepilogo: gerarchia di forme9Progetto: Disegnatore di forme
Panoramica del progettoImplementazione del cerchioImplementazione del rettangoloUtilizzo polimorficoContenitore di formeEsercitati da solo: Compilatore C online