C - Unioni

UN unionè un tipo di dati speciale disponibile in C che consente di memorizzare diversi tipi di dati nella stessa posizione di memoria. È possibile definire un'unione con molti membri, ma solo un membro può contenere un valore in un dato momento. Le unioni forniscono un modo efficiente di utilizzare la stessa posizione di memoria per più scopi.

Definire un'unione

Per definire un'unione, è necessario utilizzare il unionnello stesso modo in cui hai definito una struttura. L'istruzione union definisce un nuovo tipo di dati con più di un membro per il programma. Il formato della dichiarazione sindacale è il seguente:

union [union tag] {
   member definition;
   member definition;
   ...
   member definition;
} [one or more union variables];

Il union tagè opzionale e ogni definizione di membro è una normale definizione di variabile, come int i; o float f; o qualsiasi altra definizione di variabile valida. Alla fine della definizione dell'unione, prima del punto e virgola finale, puoi specificare una o più variabili di unione ma è opzionale. Ecco il modo in cui definiresti un tipo di unione denominato Data con tre membri i, f e str -

union Data {
   int i;
   float f;
   char str[20];
} data;

Ora, una variabile di Datatype può memorizzare un numero intero, un numero a virgola mobile o una stringa di caratteri. Significa che una singola variabile, ovvero la stessa posizione di memoria, può essere utilizzata per memorizzare più tipi di dati. È possibile utilizzare qualsiasi tipo di dati predefinito o definito dall'utente all'interno di un'unione in base alle proprie esigenze.

La memoria occupata da un sindacato sarà abbastanza grande da contenere il membro più numeroso del sindacato. Ad esempio, nell'esempio precedente, Tipo di dati occuperà 20 byte di spazio di memoria perché questo è lo spazio massimo che può essere occupato da una stringa di caratteri. L'esempio seguente mostra la dimensione totale della memoria occupata dall'unione sopra -

#include <stdio.h>
#include <string.h>
 
union Data {
   int i;
   float f;
   char str[20];
};
 
int main( ) {

   union Data data;        

   printf( "Memory size occupied by data : %d\n", sizeof(data));

   return 0;
}

Quando il codice precedente viene compilato ed eseguito, produce il seguente risultato:

Memory size occupied by data : 20

Accesso ai membri dell'Unione

Per accedere a qualsiasi membro di un sindacato, utilizziamo il member access operator (.). L'operatore di accesso ai membri è codificato come un punto tra il nome della variabile di unione e il membro di unione a cui si desidera accedere. Useresti la parola chiaveunionper definire variabili di tipo union. L'esempio seguente mostra come utilizzare le unioni in un programma:

#include <stdio.h>
#include <string.h>
 
union Data {
   int i;
   float f;
   char str[20];
};
 
int main( ) {

   union Data data;        

   data.i = 10;
   data.f = 220.5;
   strcpy( data.str, "C Programming");

   printf( "data.i : %d\n", data.i);
   printf( "data.f : %f\n", data.f);
   printf( "data.str : %s\n", data.str);

   return 0;
}

Quando il codice precedente viene compilato ed eseguito, produce il seguente risultato:

data.i : 1917853763
data.f : 4122360580327794860452759994368.000000
data.str : C Programming

Qui possiamo vedere che i valori di i e f membri di union si sono corrotti perché il valore finale assegnato alla variabile ha occupato la locazione di memoria e questo è il motivo per cui il valore di str membro viene stampato molto bene.

Ora esaminiamo ancora una volta lo stesso esempio in cui useremo una variabile alla volta che è lo scopo principale di avere unioni -

#include <stdio.h>
#include <string.h>
 
union Data {
   int i;
   float f;
   char str[20];
};
 
int main( ) {

   union Data data;        

   data.i = 10;
   printf( "data.i : %d\n", data.i);
   
   data.f = 220.5;
   printf( "data.f : %f\n", data.f);
   
   strcpy( data.str, "C Programming");
   printf( "data.str : %s\n", data.str);

   return 0;
}

Quando il codice precedente viene compilato ed eseguito, produce il seguente risultato:

data.i : 10
data.f : 220.500000
data.str : C Programming

Qui, tutti i membri vengono stampati molto bene perché viene utilizzato un membro alla volta.