Programmation en C – Les unions
Union est un type de données spécial disponible en C qui permet de stocker différents types de données dans le même emplacement de mémoire. Vous pouvez définir une union avec plusieurs membres, mais un seul membre peut contenir une valeur à la fois. Les Unions offrent un moyen efficace d’utiliser le même emplacement de mémoire à des fins multiples.
Définir une union
Pour définir une union, vous devez utiliser l’instruction union de la même manière que vous l’avez fait lors de la définition d’une structure. L’instruction union définit un nouveau type de données avec plusieurs membres pour votre programme. Le format de la déclaration d’union est le suivant
union [union tag] { définition de membre1; définition de membre2; ... définition de membreN; } [une ou plusieurs variables d'union];
union tag est facultative et chaque définition de membre est une définition de variable normale, telle que int a; ou float b; ou toute autre définition de variable valide. À la fin de la définition de l’union, avant le dernier point-virgule, vous pouvez spécifier une ou plusieurs variables d’union, mais c’est facultatif. Voici comment définir un type d’union nommé MaUnion ayant trois membres a, b et tab
union MaUnion { int a; float b; char tab[10]; } maunion;
Maintenant, une variable de type MaUnion peut stocker un entier, un nombre flottante ou une chaîne de caractères. Cela signifie qu’une seule variable, c’est-à-dire le même emplacement de mémoire, peut être utilisée pour stocker plusieurs types de données. Vous pouvez utiliser n’importe quel type de données dans une union en fonction de vos besoins.
La mémoire occupée par une union sera assez grande pour contenir le plus grand membre de l’union. Par exemple, dans l’exemple ci-dessus, le type de données occupera 10 octets d’espace mémoire car il s’agit de l’espace maximal pouvant être occupé par une chaîne de caractères. L’exemple suivant affiche la taille totale de la mémoire occupée par l’union ci-dessus
#include <stdio.h> #include <string.h> union MaUnion { int a; float b; char tab[10]; } maunion; int main( ) { union MaUnion maunion; printf( "Taille de la mémoire occupée par maunion : %dn", sizeof(maunion)); return 0; }
Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant
Taille de la mémoire occupée par maunion : 12
Accéder aux membres de l’Union
Pour accéder à un membre d’une union, nous utilisons l’opérateur d’accès membre (.). L’opérateur d’accès membre est codé comme une point entre le nom de la variable d’union et le membre d’union auquel nous souhaitons accéder. Vous utiliseriez le mot-clé union pour définir les variables de type union. L’exemple suivant montre comment utiliser des unions dans un programme
#include <stdio.h> #include <string.h> union MaUnion { int a; float b; char tab[10]; } maunion; int main( ) { union MaUnion maunion; maunion.a = 10; maunion.b = 220.5; strcpy( maunion.tab, "Bonjour"); printf( "maunion.a : %dn", maunion.a); printf( "maunion.b : %fn", maunion.b); printf( "maunion.tab : %sn", maunion.tab); return 0; }
Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant
maunion.a : 1785622338 maunion.b : 72062436308247284757299200.000000 maunion.tab : Bonjour
Ici, nous pouvons voir que les valeurs des membres a et b de l’union ont été corrompues parce que la valeur finale affectée à la variable a occupé l’emplacement mémoire et c’est la raison pour laquelle la valeur du membre tab est affichée très bien.
Maintenant, regardons le même exemple encore une fois où nous allons utiliser une variable à la fois, ce qui est le but principal d’avoir des unions
#include <stdio.h> #include <string.h> union MaUnion { int a; float b; char tab[10]; } maunion; int main( ) { union MaUnion maunion; maunion.a = 10; printf( "maunion.a : %dn", maunion.a); maunion.b = 220.5; printf( "maunion.b : %fn", maunion.b); strcpy( maunion.tab, "Bonjour"); printf( "maunion.tab : %sn", maunion.tab); return 0; }
Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant
maunion.a : 10 maunion.b : 220.500000 maunion.tab : Bonjour
Ici, tous les membres s’affichent très bien parce que chaque membre est utilisé à la fois.