Datentypen in "C", Teil 5 |
|
Eine
Union ist eine Variable, welche verschiedene Datentypen annehmen kann, aber immer
nur einen davon zu einem bestimmten Zeitpunkt.
Dieser Datentyp ist auch in Pascal
bekannt unter der Bezeichnung Variantenrecord.
Im folgenden Beispiel deklarieren wir eine Union, welche entweder einen Integer- oder einen Fliesskommawert aufnehmen kann.
union value {
int ival; /*
Entweder soll ein Integerwert */
double dval; /*
oder ein double-Wert gespeichert werden */
};
Der Compiler reserviert für eine Unionsvariable immer soviel Speicherplatz, wie zur Darstellung des längsten Mitglieds der Union erforderlich ist. Die Grösse einer solchen Variable kann mit dem Operator sizeof bestimmt werden.
Wenn wir nun eine Variable x definieren mit dem gewünschten Typen, so kann x entweder einen Integerwert oder einen Fliesskommawert speichern. Welcher Datentyp schlussendlich in x gespeichert ist müssen wir in einer Hilfsvariable selber verwalten.
union
value x;
int xtyp; /*
Hilfsvariable zur Verwaltung */
if (xtyp == 1) x.ival = 10; /* Integerwert in x speichern
*/
else if (xtyp == 2) x.dval =
15.6321; /* Fliesskommawert in x
speichern */
else /* ungueltiger Datentyp */
Der Zugriff erfolgt auf die gleiche Art und Weise wie wir es bereits bei den Strukturen gesehen haben, nämlich mit dem Punkt-Operator (.) bzw. dem Dereferenzierungsoperator (->), wenn wir über einen Zeiger auf eine Union zugreifen..
In vielen Fällen wird die Union eingebettet in eine Struktur, wobei die Hilfsvariable zur Bestimmung des Datentyps als Strukturelement mitgeführt wird.
struct
anytype {
int datatyp;
/*
Kennzeichnung des Datentypen */
union {
int ival;
double dval;
} value;
};
|