C/Enumerazioni, strutture e unioni/Unioni
Wikibooks, manuali e libri di testo liberi.
- Il linguaggio
- Variabili, operatori e costanti
- Blocchi e funzioni
- Vettori e puntatori
- Stringhe
- Enumerazioni, strutture e unioni
- Enumerazioni
- Strutture -
- Unioni
- Lettura e scrittura su file
- Compilatore e precompilatore
- File di header
- Gestione della memoria
- Le applicazioni CGI
- Approfondimenti
- Appendice
- Bibliografia
Un'unione è una struttura i cui membri condividono lo stesso spazio di memoria. I vantaggi delle unioni sono:
- Si risparmia memoria;
- Si possono interpretare dati in modi diversi.
[modifica] Sintassi
union lamiaunione { tipo membro1; tipo membro2; ... tipo membroN; } variabili;
L'istruzione union dichiare 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:
union lamiaunione lamiavariabile;
[modifica] Esempi
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:
#include <stdio.h> #include <stdlib.h> int main(void) { #define N 3 struct miastruttura{ char tipo; // il tipo di valore union miaunione{ int intero; char* stringa; } valore; } risultati[N]; int a[3] = {1,2,3}; int b[3] = {56, 98, 33}; char errstr[] = "Errore"; int i; for (i = 0; i < N; i++) if (a[i]) { risultati[i].tipo = 'I'; risultati[i].valore.intero = b[i] / a[i]; } else { risultati[i].tipo = 'C'; risultati[i].valore.stringa = errstr; } return 0; }
che memorizza il quoziente di una divisione nel caso questa sia possibile, altrimenti memorizza la stringa "Errore".

