Unions

De RAD Studio
Aller à : navigation, rechercher

Remonter à Unions - Index

Les types unions sont des types dérivés possédant un grand nombre de caractéristiques syntaxiques et fonctionnelles identiques aux types structures. La principale différence est que, dans une union, un seul membre à la fois peut être "actif". La taille d'une union est celle de son membre le plus grand. La valeur d'un seul de ses membres peut être stockée à tout moment. Dans le cas suivant :



 union myunion {     /* sélecteur d'union = myunion */
    int i;
    double d;
    char ch;
 } mu, *muptr=μ



l'identificateur mu, du type union myunion, est utilisable pour contenir un int, un double sur 8 octets ou un char à octet unique, mais il ne peut contenir qu'une seule de ces valeurs à la fois.

Remarque :  Les unions correspondent au type enregistrement avec variantes de Delphi.

sizeof(union myunion) et sizeof(mu) renvoient l'un et l'autre la valeur 8, mais 4 octets restent inutilisés (avec des caractères de remplissage) lorsque mu contient un objet int, et 7 octets restent inutilisés lorsque mu contient un char. Vous accédez aux membres de l'union par les opérateurs d'accès aux membres des structures (. et ->), avec un minimum de précautions toutefois :



 mu.d = 4.016;
 printf("mu.d = %f\n",mu.d); //OK: affiche mu.d = 4.016
 printf("mu.i = %d\n",mu.i); //résultat bizarre
 mu.ch = 'A';
 printf("mu.ch = %c\n",mu.ch); //OK: affiche mu.ch = A
 printf("mu.d = %f\n",mu.d); //résultat bizarre
 muptr->i = 3;
 printf("mu.i = %d\n",mu.i); //OK: affiche mu.i = 3



Le deuxième printf est légal puisque mu.i est de type entier. Cependant la configuration de mu.i correspond à des parties de double ayant précédemment fait l'objet d'une affectation, et le résultat ne correspond à rien d'utile.

Après conversion correcte, un pointeur d'union pointe sur chacun de ses membres, et inversement.