A prima vista l'Union assomiglia alla struct...In realtà le due sono cose totalmente diverse.
Mentre nella Struct, tutti i campi definiti al suo interno risiedono in una posizione esclusiva in memoria, nella union essi puntano tutti alla stessa locazione.
Quando si definisce una union, in memoria viene allocato tanto spazio quanto ne occupa il tipo di dato più esoso in essa definito.
In questo modo è possibile accedere allo stesso dato con rappresentazioni diverse tra loro.
Un esempio:
Supponiamo che dato un valore di tipo long, io debba "spezzarlo" in 4 byte. Potrei attraverso opportune maschere ricavarmi i 4 byte di cui è formato il long, oppure potrei usare una union per crearmi il seguente tipo di dato.
Codice:
union split {
long lValue;
char bValue[4];
}
union split myLong;
A questo punto si può fare:
myLong.lValue = <valore>
E per accedere ai vari byte è sufficiente fare
var1 = myLong.bValue[0];
var2 = myLong.bValue[1];
...e così via.
Naturalmente vale anche il procedimento inverso...posso inserire i bytes in bValue e ricavarmi il long.
Ricapitolando: la union permette di rappresentare la stessa zona di memoria associata ad una viariabile in più modi (definiti nella union stessa). Il quantitativo di memoria utilizzato è dato dal tipo di dato + esoso (in termini di spazio) definito all'interno della union stessa: cioè se definisco un long ed un char, la union allocherà spazio per un long, se definisco un long ed un vettore di 10 caratteri, la union occuperà 10 caratteri...
Spero di essermi spiegato
Aloha!