21.11.2013 Aufrufe

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 ...

MEHR ANZEIGEN
WENIGER ANZEIGEN

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!