Concetti Chiave
- Le union permettono di risparmiare memoria contenendo diversi tipi di dato nella stessa locazione, ma solo un membro può avere un valore contemporaneamente.
- Le union possono essere inizializzate solo con il valore del primo membro e si accede ai loro contenuti tramite gli operatori "." e "->".
- Un discriminante è spesso usato con le union per tenere traccia del campo attualmente valido, richiedendo l'annidamento della union in una struct.
- L'operatore typedef consente di creare nuovi nomi per i tipi di dato, migliorando la leggibilità del codice e la portabilità attraverso standard come size_t.
- Le regole per la dichiarazione delle variabili in union e typedef sono simili a quelle di struct ed enum, garantendo coerenza nella gestione dei tipi di dato.
Il tipo di dato union è un tipo di dato che può contenere tipi di dato differente nella stessa locazione di memoria, ma solo un membro contiene un valore in un preciso momento, i campi condividono quindi la stessa locazione di memoria e si escludono a vicenda.
Utilizzo e inizializzazione delle union
I tipi di dati union vengono utilizzate per ottimizzare l’uso della memoria. Si può accedere al contenuto delle varie union tramite l’utilizzo degli operatori ”.” e “->”. La union può essere inizializzata fornendo esclusivamente il valore del tipo del suo primo membro.
union [tag] {
…
tipoN>
};
Il tag è opzionale e la dimensione di un tipo union è uguale alla dimensione del tipo di dato del campo più grande. Gli operatori si comportano come nel tipo di dato struct e i limiti di annidamento e numero di campi è lo stesso di struct. Le regole usate per la dichiarazione di variabili sono le stesse per enum e struct.
Struttura e discriminante nelle union
Solitamente si usa union con un discriminante, che tiene traccia del campo valido in un dato momento, ma è necessario annidare la union in una struct.
struct xtype {
unsigned int type; //discriminante
union { char ctype ; int itype ; float ftype ; double dtype ;} val ;
};
L’operatore typedef permette di creare nuovi nomi per i tipi di dato. Il nome dichiarato diventa sinonimo per il tipo di dato dichiarato, quindi i nuovi tipi sono trattati come quelli originari.
typedef
E possibile usare l’operatore typedef anche per definire come nuovo tipo di dato una funzione
typedef
L’operatore typedef viene spesso usato per nascondere come il compilatore gestisce alcuni tipi di dato, fornendo un comportamento standard e aumentando la portabilita del codice (es.size_t nella libreria stddef.h dichiara un unsigned int che rappresenta la dimensione in byte di un oggetto, di solito i nomi dei tipi di dato che terminano con _t sono nomi riservati).
Domande da interrogazione
- Qual è la principale caratteristica delle union in C?
- Come si inizializza una union in C?
- Qual è il ruolo del discriminante nelle union?
Le union in C possono contenere tipi di dato differenti nella stessa locazione di memoria, ma solo un membro può contenere un valore in un dato momento, ottimizzando così l'uso della memoria.
Una union può essere inizializzata fornendo esclusivamente il valore del tipo del suo primo membro, e la sua dimensione è uguale a quella del campo più grande.
Il discriminante, solitamente utilizzato in una struct che annida una union, tiene traccia del campo valido in un dato momento, permettendo di gestire correttamente i diversi tipi di dato contenuti nella union.