Guide débutant sur les unions en C

Bonjour à tous, futurs programmeurs ! Aujourd'hui, nous allons entreprendre un voyage passionnant dans le monde de la programmation C, en nous concentrant sur un concept tout à fait ingénieux appelé "unions". Ne vous inquiétez pas si vous n'en avez jamais entendu parler auparavant - d'ici la fin de ce tutoriel, vous serez un expert des unions !

C - Unions

Qu'est-ce qu'une union en C ?

Commençons par les bases. Imaginez que vous avez une boîte magique qui peut contenir différents types d'objets, mais seulement un à la fois. C'est essentiellement ce qu'est une union en programmation C ! Il s'agit d'un type de données spécial qui vous permet de stocker différents types de données dans la même emplacement mémoire.

Vous vous demandez peut-être : "Mais pourquoi voudrais-je faire cela ?" Eh bien, mon ami curieux, les unions sont incroyablement utiles lorsque vous souhaitez économiser de la mémoire ou lorsque vous avez besoin d'utiliser le même emplacement mémoire pour des objectifs différents à des moments différents.

Définir une union

Définir une union est plutôt simple. C'est similaire à la définition d'une structure, mais nous utilisons le mot-clé union au lieu de struct. Voici un exemple simple :

union MyUnion {
int integer;
float floating_point;
char character;
};

Dans cet exemple, nous avons créé une union appelée MyUnion qui peut contenir un entier, un nombre à virgule flottante ou un caractère. Souvenez-vous de notre analogie de la boîte magique ? Cette union est comme une boîte qui peut contenir soit un nombre, soit un décimal, soit une lettre - mais seulement un à la fois !

Accéder aux membres d'une union

Accéder aux membres d'une union est aussi simple que bonjour ! Vous utilisez la notation pointée (.) tout comme vous le feriez avec des structures. Voici comment cela fonctionne :

union MyUnion u;
u.integer = 42;
printf("La valeur entière est : %d\n", u.integer);

u.floating_point = 3.14;
printf("La valeur flottante est : %f\n", u.floating_point);

u.character = 'A';
printf("La valeur du caractère est : %c\n", u.character);

Dans cet exemple, nous stockons différents types de données dans notre union et les affichons. Mais attention - et c'est un point important - lorsque vous affectez une nouvelle valeur à un membre d'une union, cela écrase la valeur précédente. Ainsi, dans notre exemple, après avoir affecté 'A' à u.character, les valeurs entières et flottantes précédentes ne sont plus accessibles.

Initialisation des membres d'une union

Initialiser une union est similaire à l'initialisation d'une structure, mais avec une différence clé : vous ne pouvez initialiser qu'un seul membre à la fois. Voici un exemple :

union MyUnion u = {42};  // Initialise le membre entier
// OU
union MyUnion u = {.floating_point = 3.14};  // Initialise le membre flottant
// OU
union MyUnion u = {.character = 'A'};  // Initialise le membre caractère

Souvenez-vous, quel que soit le membre que vousinitialisez, c'est le seul qui aura une valeur valide pour commencer.

Exemples d'utilisation d'une union

Voyons un exemple plus pratique. Imaginez que vous créez un programme pour gérer différents types d'employés dans une entreprise :

#include <stdio.h>
#include <string.h>

union EmployeeID {
int number;
char string[20];
};

struct Employee {
char name[50];
union EmployeeID id;
int id_type;  // 0 pour number, 1 pour string
};

int main() {
struct Employee emp1, emp2;

strcpy(emp1.name, "John Doe");
emp1.id.number = 12345;
emp1.id_type = 0;

strcpy(emp2.name, "Jane Smith");
strcpy(emp2.id.string, "ABC-XYZ");
emp2.id_type = 1;

printf("Employé 1 : %s, ID : %d\n", emp1.name, emp1.id.number);
printf("Employé 2 : %s, ID : %s\n", emp2.name, emp2.id.string);

return 0;
}

Dans cet exemple, nous utilisons une union pour stocker soit un identifiant numérique, soit un identifiant sous forme de chaîne pour chaque employé. Le champ id_type dans la structure Employee nous indique quel type d'identifiant nous avons.

Taille d'une union

Voici un fait intéressant à propos des unions : la taille d'une union est déterminée par son plus grand membre. Voyons un exemple :

#include <stdio.h>

union SizeTest {
int i;
float f;
char c;
};

int main() {
union SizeTest st;
printf("Taille de l'union : %lu octets\n", sizeof(st));
printf("Taille d'un entier : %lu octets\n", sizeof(int));
printf("Taille d'un flottant : %lu octets\n", sizeof(float));
printf("Taille d'un caractère : %lu octet\n", sizeof(char));
return 0;
}

Lorsque vous exécutez ce programme, vous verrez que la taille de l'union est la même que celle de son plus grand membre (ce qui est généralement le float ou l'int, selon votre système).

Différences entre une structure et une union

Vous vous demandez peut-être : "Comment cela diffère-t-il d'une structure ?" Excellent pregunta ! Voici un résumé :

Fonctionnalité Structure Union
Allocation mémoire Alloue de la mémoire pour tous les membres Alloue de la mémoire uniquement pour le plus grand membre
Accès aux membres Tous les membres peuvent être accessibles simultanément Seul un membre peut être accessible à la fois
Utilisation de la mémoire Utilise plus de mémoire Utilise moins de mémoire
Stockage des données Peut stocker plusieurs valeurs à la fois Peut stocker une seule valeur à la fois
Initialisation Peut initialiser tous les membres à la fois Peut initialiser un seul membre à la fois

En substance, les structures sont comme un tas de boîtes collées ensemble, chacune contenant son propre item, tandis que les unions sont comme une boîte qui peut contenir différents types d'items, mais seulement un à la fois.

Et voilà, amis ! Vous avez刚刚 fait vos premiers pas dans le monde des unions en C. Souvenez-vous, la pratique rend parfait, alors n'ayez pas peur d'expérimenter avec ces concepts. Qui sait ? Vous pourriez bien trouver des unions pour créer la prochaine grande innovation logicielle !

Bonne programmation, et que la union soit avec vous ! ?

Credits: Image by storyset