Eine Datensequenz (struct) ist ähnlich einem Array eine Aneinanderreihung von Daten, d.h. die Elemente der struct liegen HINTEREINANDER im Speicher. Im Gegensatz zu Arrays müssen die aneinander gefügten Daten jedoch nicht den gleichen Datentyp haben und sie werden nicht über einen Index sondern über einen vom Programmierer gewählten Namen angesprochen.
Eine Datenalternative (union) ist formal gleichartig zu handhaben wie eine Datensequenz (struct), der große Unterschied ist aber, dass alle Elemente einer union an DERSELBEN Speicheradresse beginnen. Mit einer union kann man somit Speicherplatz sparen. Im Normalfall wird nur ein Element der union gleichzeitig verwenden, da einander die Elemente der union gegenseitig beeinflussen.
Bei
der Deklaration einer Datenstruktur werden KEINE Variablen angelegt
(=definiert). Obwohl es in C möglich ist, die Deklaration von
Datenstrukturen direkt mit dem Definieren von Variablen zu verbinden,
sollten Sie im Sinne einer sauberen Trennung von Deklaration und
Definition von dieser Möglichkeit keinen Gebrauch machen. In der
Regel befinden sich die Deklarationen von Datenstrukturen in
Headerfiles (=Include-Dateien), damit sie von unterschiedlichen
Modulen einheitlich verwendet werden können.
Um eine Variable meinPunkt zu erzeugen schreibt man : struct punkt meinPunkt;
Um sich das struct bei der Variablendefinition zu ersparen, kann man anstelle einer Deklaration einer Datenstruktur mit Hilfe des Wortes typedef einen neuen Datentyp definieren:
typedef
struct
{
int x;
int y;
}punkt;
Um eine Variable meinPunkt zu erzeugen schreibt man nur noch : punkt meinPunkt;
Datenstrukturen und neue Datentypen
werden gleichartig verwendet.
Datenstrukturen können beliebig
verschachtelt werden.
Datenstrukturen werden gleichartig wie
normale Datentypen zum Erzeugen von Variablen (Objekten)
verwendet.
Datenstrukturen können auch als Parameter an
Funktionen übergeben werden.
Datenstrukturen können auch
Rückgabewerte von Funktionen sein.
Natürlich dürfen
auch Pointer auf Datenstrukturen definiert und verwendet werden.
Wichtiger Merksatz bei der Verwendung von einem
Pointer auf eine Datenstruktur:
Ist p ein Zeiger
(Pointer) auf eine Datenstruktur und x ein Feld (Element)
dieser Datenstruktur so läßt sich auf das Feld (Element)
mit beiden gleichwertigen Ausdrücken (*p).x oder p->x
zugreifen. Beide Ausdrücke können im Falle einer
Zuweisung (=) sowohl auf der rechten Seite (R-Value) als auch auf der
linken Seite (L-Value) verwendet werden.