Eine Einführung in die Programmiersprache C und die Grundlagen ...
Eine Einführung in die Programmiersprache C und die Grundlagen ...
Eine Einführung in die Programmiersprache C und die Grundlagen ...
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
<strong>E<strong>in</strong>e</strong> <strong>E<strong>in</strong>führung</strong> <strong>in</strong> <strong>die</strong> Informatik <strong>und</strong> <strong>die</strong> <strong>Programmiersprache</strong> C<br />
14 Unions<br />
<strong>E<strong>in</strong>e</strong> Union ist fast dasselbe wie e<strong>in</strong>e Struktur, mit dem Unterschied dass alle Datenfelder denselben<br />
Platz im Speicher belegen (Sich also am selben Ort im Speicher aufhalten). In e<strong>in</strong>er Union kann<br />
somit immer nur e<strong>in</strong>e der enthaltenen Variablen verwendet werden. Die Union braucht immer nur<br />
soviel Platz wie <strong>die</strong> grösste der <strong>in</strong> ihr enthaltenen Variablen. <strong>E<strong>in</strong>e</strong> Union kann verwendet werden,<br />
wenn zur selben Zeit immer nur e<strong>in</strong>e der möglichen Variablen benutzt wird, damit kann Speicherplatz<br />
gespart werden.<br />
union Convert {<br />
char Bytes[4]; /* E<strong>in</strong> Array von 4 Bytes<br />
*/<br />
*/<br />
};<br />
long Value;<br />
/* <strong>und</strong> e<strong>in</strong> long teilen sich denselben Speicher<br />
union Convert x;<br />
long l = 0x12345678;<br />
x.Value = l;<br />
*/<br />
/* Den Longwert <strong>in</strong> den geme<strong>in</strong>samen Speicher schreiben<br />
pr<strong>in</strong>tf("Byte 0: %d\n", x.Bytes[0]); /* Und Byteweise wieder auslesen... */<br />
pr<strong>in</strong>tf("Byte 1: %d\n", x.Bytes[1]);<br />
pr<strong>in</strong>tf("Byte 2: %d\n", x.Bytes[2]);<br />
pr<strong>in</strong>tf("Byte 3: %d\n", x.Bytes[3]);<br />
Dieses Beispiel zerlegt e<strong>in</strong>en Long-Wert <strong>in</strong> se<strong>in</strong>e e<strong>in</strong>zelnen Bytes. Achtung, <strong>die</strong>ser Code ist nicht<br />
portabel, da jeder Prozessor/Compiler <strong>die</strong> Bytes von Variablen <strong>in</strong> unterschiedlicher Reihenfolge im<br />
Speicher ablegt <strong>und</strong> e<strong>in</strong> long nicht bei jedem System 4 Bytes (32 Bit) belegt.<br />
Der Unterschied zwischen Struktur <strong>und</strong> Union ist nachfolgend zu sehen:<br />
Struktur<br />
struct demo {<br />
char C;<br />
long L;<br />
short S;<br />
};<br />
Union<br />
union demo {<br />
char C;<br />
long L;<br />
short S;<br />
};<br />
C<br />
L<br />
S<br />
S LC<br />
Die Union legt <strong>die</strong> Elemente übere<strong>in</strong>ander im selben Speicherbereich ab, <strong>und</strong> benötigt deshalb weniger<br />
Speicherplatz, dafür kann immer nur e<strong>in</strong>es der Elemente unbee<strong>in</strong>flusst verwendet werden.<br />
Unions können wie Strukturen bei der Def<strong>in</strong>ition gleich <strong>in</strong>itialisiert werden, wobei aber immer nur<br />
e<strong>in</strong> Initialisierer angegeben werden darf, es wird immer das erste Element der Union <strong>in</strong>itialisiert.<br />
[C99] In C99 kann analog zur Struktur mit e<strong>in</strong>em direkten Initialisierer e<strong>in</strong> beliebiges Element der<br />
Union <strong>in</strong>itialisiert werden.<br />
Gedruckt am 10.09.2009 14:23:00 Letzte Änderung am: 10. September 2009 Version 2.4.1, I. Oesch 54/147