L'Unione è un tipo di dati definito dall'utente in linguaggio C che può contenere elementi di diversi tipi di dati proprio come la struttura. Ma a differenza delle strutture, tutti i membri dell'unione C sono archiviati nella stessa posizione di memoria. Per questo motivo, solo un membro può archiviare i dati in una determinata istanza.

Sintassi dell'unione in C
La sintassi dell'unione in C può essere divisa in tre passaggi che sono i seguenti:
Dichiarazione dell'Unione C
In questa parte, dichiariamo solo il modello dell'unione, ovvero dichiariamo solo i nomi e i tipi di dati dei membri insieme al nome dell'unione. Nella dichiarazione non viene allocata memoria all'unione.
union union_name { datatype member1 ; datatype member2 ; ... };>
Tieni presente che dobbiamo sempre terminare la dichiarazione sindacale con un punto e virgola.
Diversi modi per definire una variabile di unione
Dobbiamo definire una variabile del tipo unione per iniziare a utilizzare i membri dell'unione. Esistono due metodi con cui possiamo definire una variabile di unione.
- Con dichiarazione dell'Unione
- Dopo la dichiarazione dell'Unione
1. Definizione della variabile dell'unione con dichiarazione
union union_name { datatype member1; datatype member2; ... } var1, var2, ...;>
2. Definizione della variabile dell'Unione dopo la dichiarazione
union union_name var1, var2, var3 ...;>
Dove nome_unione è il nome di un'unione già dichiarata.
Accedi ai membri dell'Unione
Possiamo accedere ai membri di un'unione utilizzando l'operatore punto ( . ) proprio come le strutture.
var1.member1 ;>
Dove var1 è il variabile unione E membro1 è il membro del sindacato .
Il metodo sopra descritto per accedere ai membri del sindacato funziona anche per i sindacati nidificati.
var1.member1.memberA;>
Qui,
- var1 è una variabile di unione.
- membro1 è membro del sindacato.
- membroA è un membro del membro1.
Inizializzazione dell'Unione in C
L'inizializzazione di un'unione è l'inizializzazione dei suoi membri semplicemente assegnandogli il valore.
var1.member1 = some_value ;>
Una cosa importante da notare qui è questa solo un membro può contenere un valore in una determinata istanza di tempo.
Esempio di Unione
C
// C Program to demonstrate how to use union> #include> // union template or declaration> union> un {> > int> member1;> > char> member2;> > float> member3;> };> // driver code> int> main()> {> > // defining a union variable> > union> un var1;> > // initializing the union member> > var1.member1 = 15;> > printf> (> 'The value stored in member1 = %d'> ,> > var1.member1);> > return> 0;> }> |
>
>Produzione
The value stored in member1 = 15>
Dimensione dell'Unione
La dimensione dell'unione sarà sempre uguale alla dimensione del membro più grande dell'array. Tutti gli elementi di dimensioni inferiori possono archiviare i dati nello stesso spazio senza alcun overflow.

Allocazione della memoria in C Union
Esempio 1: programma C per trovare la dimensione dell'unione
C
// C Program to find the size of the union> #include> // declaring multiple unions> union> test1 {> > int> x;> > int> y;> } Test1;> union> test2 {> > int> x;> > char> y;> } Test2;> union> test3 {> > int> arr[10];> > char> y;> } Test3;> // driver code> int> main()> {> > // finding size using sizeof() operator> > int> size1 => sizeof> (Test1);> > int> size2 => sizeof> (Test2);> > int> size3 => sizeof> (Test3);> > printf> (> 'Sizeof test1: %d
'> , size1);> > printf> (> 'Sizeof test2: %d
'> , size2);> > printf> (> 'Sizeof test3: %d'> , size3);> > return> 0;> }> |
>
>
cos'è la gestione delle eccezioni in JavaProduzione
Sizeof test1: 4 Sizeof test2: 4 Sizeof test3: 40>
Differenza tra struttura C e unione C
La tabella seguente elenca la differenza chiave tra la struttura e l'unione in C:
Struttura | Unione |
---|---|
La dimensione della struttura è uguale o maggiore della dimensione totale di tutti i suoi membri. | La dimensione dell’unione è la dimensione del suo membro più grande. |
La struttura può contenere dati in più membri contemporaneamente. | Solo un membro può contenere dati contemporaneamente. |
Viene dichiarato utilizzando la parola chiave struct. | Viene dichiarato utilizzando la parola chiave union. |
Domande frequenti sulle unioni C
1. Qual è la dimensione di questa unione?
union un { int a; int arr[20]; }>
Risposta: La dimensione dell'unione data è 20 x 4 byte = 80 byte. Anche se l'array è una raccolta di elementi di dati simili, viene considerato una singola entità dal compilatore C.
2. Possiamo archiviare i dati di più membri del sindacato contemporaneamente?
No. Possiamo archiviare i dati solo in un singolo membro contemporaneamente. Ad esempio, nel seguente programma C, sia x che y condividono la stessa posizione. Se cambiamo x, possiamo vedere i cambiamenti riflessi in y.
C
// C program to check if we can store data in multiple union> // members> #include> // Declaration of union is same as structures> union> test {> > int> x, y;> };> int> main()> {> > // A union variable t> > union> test t;> > t.x = 2;> // t.y also gets value 2> > printf> (> 'After making x = 2:
x = %d, y = %d
'> , t.x,> > t.y);> > t.y = 10;> // t.x is also updated to 10> > printf> (> 'After making y = 10:
x = %d, y = %d
'> , t.x,> > t.y);> > return> 0;> }> |
>
.04 come frazione
>Produzione
After making x = 2: x = 2, y = 2 After making y = 10: x = 10, y = 10>
3. Quali sono le richieste dei sindacati?
Le unioni possono essere utili in molte situazioni in cui vogliamo utilizzare la stessa memoria per due o più membri. Ad esempio, supponiamo di voler implementare una struttura dati ad albero binario in cui ogni nodo foglia ha un doppio valore di dati, mentre ogni nodo interno ha puntatori a due figli, ma nessun dato. Se lo dichiariamo come:
C
struct> NODE {> > struct> NODE* left;> > struct> NODE* right;> > double> data;> };> |
>
>
quindi ogni nodo richiede 16 byte, con metà dei byte sprecati per ciascun tipo di nodo. D'altra parte, se dichiariamo un nodo come segue, possiamo risparmiare spazio.
C
struct> NODE {> > bool> is_leaf;> > union> {> > struct> {> > struct> NODE* left;> > struct> NODE* right;> > } internal;> > double> data;> > } info;> };> |
>
>