Datentypen in "C", Teil 5

Unionen (Unions)

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;
         };