# C/Enumerazioni, strutture e unioni/Unioni

C
Copertina Tutti i moduli · Sviluppo
* LinguaggioC/Linguaggio
** PanoramicaC/Linguaggio/Panoramica
** Struttura del linguaggioC/Linguaggio/Struttura del linguaggio
* Variabili, operatori e costantiC/Variabili, operatori e costanti
** VariabiliC/Variabili, operatori e costanti/Variabili
** Operatori aritmeticiC/Variabili, operatori e costanti/Operatori aritmetici
** Operatori sui bitC/Variabili, operatori e costanti/Operatori sui bit
** CostantiC/Variabili, operatori e costanti/Costanti
* Blocchi e funzioniC/Blocchi e funzioni
** Blocchi if e switchC/Blocchi e funzioni/Blocchi if e switch
** Operatori logiciC/Blocchi e funzioni/Operatori logici
** CicliC/Blocchi e funzioni/Cicli
** FunzioniC/Blocchi e funzioni/Funzioni
** mainC/Blocchi e funzioni/main
** LibrerieC/Blocchi e funzioni/Librerie
** RicorsivitàC/Blocchi e funzioni/Ricorsività
* Vettori e puntatoriC/Vettori e puntatori
** VettoriC/Vettori e puntatori/Vettori
** PuntatoriC/Vettori e puntatori/Puntatori
** Interscambiabilità tra puntatori e vettoriC/Vettori e puntatori/Interscambiabilità tra puntatori e vettori
* StringheC/Variabili, operatori e costanti/Stringhe
* Enumerazioni, strutture e unioniC/Enumerazioni, strutture e unioni
** EnumerazioniC/Enumerazioni, strutture e unioni/Enumerazioni
** StruttureC/Enumerazioni, strutture e unioni/Strutture
** UnioniC/Enumerazioni, strutture e unioni/Unioni
* Conversioni di tipoC/Conversioni di tipo
* Lettura e scrittura su fileC/Lettura e scrittura su file
** File di TestoC/Lettura e scrittura su file/File di Testo
** File BinariC/Lettura e scrittura su file/File Binari
* Compilatore e precompilatoreC/Compilatore e precompilatore
** CompilatoreC/Compilatore e precompilatore/Compilatore
** DirettiveC/Compilatore e precompilatore/Direttive
** HeaderC/Compilatore e precompilatore/Header
* VisibilitàC/Visibilità
* Gestione della memoriaC/Gestione della memoria
* Le applicazioni CGIC/Le applicazioni CGI
* Appendice
** Librerie standardC/Appendice/Librerie standard
*** assert.hC/Appendice/Librerie standard/assert.h
*** ctype.hC/Appendice/Librerie standard/ctype.h
*** errno.hC/Appendice/Librerie standard/errno.h
*** float.hC/Appendice/Librerie standard/float.h
*** limits.hC/Appendice/Librerie standard/limits.h
*** locale.hC/Appendice/Librerie standard/locale.h
*** math.hC/Appendice/Librerie standard/math.h
*** setjmp.hC/Appendice/Librerie standard/setjmp.h
*** signal.hC/Appendice/Librerie standard/signal.h
*** stdarg.hC/Appendice/Librerie standard/stdarg.h
*** stddef.hC/Appendice/Librerie standard/stddef.h
*** stdio.hC/Appendice/Librerie standard/stdio.h
*** stdlib.hC/Appendice/Librerie standard/stdlib.h
*** string.hC/Appendice/Librerie standard/string.h
*** time.hC/Appendice/Librerie standard/time.h
** StrumentiC/Appendice/Strumenti
*** InstallerC/Appendice/Strumenti/Installer
** Librerie esterneC/Appendice/Librerie esterne
* Bibliografia
    IndiceC/Indice
Modifica il sommario
Un'unione è un tipo di dato i cui membri condividono lo stesso spazio di memoria. In altre parole, una unione permette di accedere ad una stessa zona di memoria tramite più di un alias. I vantaggi delle unioni sono:
* Si risparmia memoria;
* Si possono interpretare dati in modi diversi.

## Sintassi

L'istruzione union dichiara una struttura lamiaunione con dei membri e definisce delle variabili di tipo lamiaunione. Le variabili sono opzionali. È importante ricordare che essendo la memoria in comune tra più variabili, non possono essere presenti due dati contemporaneamente. L'esempio che segue infatti mostra una semplice modalità per capire il tipo di dato attualmente presente nella union e quindi come interpretarlo.
La sintassi per specificare ulteriori variabili di tipo lamiaunione dopo la dichiarazione dell'unione è questa:
Con le unioni si possono eseguire l'operazione di assegnamento di un'unione ad un'altra unione dello stesso tipo, accedendo ai membri dell'unione utilizzando l'operatore punto '.'. Non sono ammessi i confronti tra unioni con gli operatori == e !=.

## Esempio 1

Una unione può essere utilizzata per memorizzare dei dati di tipo differente all'interno della stessa struttura. Con una struttura definita nel seguente modo potremmo ad esempio memorizzare una serie di risultati, interi o stringa, ottenuti in un'elaborazione. Un esempio banale potrebbe essere:
che memorizza il quoziente di una divisione nel caso questa sia possibile, altrimenti memorizza la stringa "Errore".

## Esempio 2

Dal momento che i membri valY e valX occupano lo stesso spazio di memoria, la seconda assegnazione sovrascrive il valore di valX, e l'output del codice di esempio sarà:

## Vantaggi e svantaggi

Le union si rivelano molto utili nei casi in cui un programma fa uso di una variabile di un certo tipo, piuttosto che di un altro, a seconda di una condizione determinata a tempo di esecuzione: infatti la union permette di mettere insieme le variabili in una stessa zona di memoria, riducendo l'occupazione di memoria.