Meist besitzen Strukturen eine überschaubare Anzahl an Komponenten,
die Anzahl ist jedoch nicht begrenzt.
Angesprochen werden Komponenten in der Form:
strukturname.komponentname
oder
zeiger_auf_eine_struktur->komponentname
Siehe Komponent-OperatorenDurch das Laufzeitsystem von C und C++ wird eine Vielzahl von Strukturen benutzt, deren Deklaration in Header-Dateien enthalten ist.
Zu unterscheiden ist bei der Deklaration
struct name { komponente_1, ..., komponente_n };
struct { komponente_1, ..., komponente_n }
variable_1, ..., variable_m;
struct name { komponente_1, ..., komponente_n }
variable_1, ..., variable_m;
struct name variable_1, ..., variable_m;In C++ darf das Schlüsselwort struct weggelassen werden.
In C++ hat eine mit struct deklarierte Struktur dieselben Eigenschaften wie eine Klasse - wenn man davon absieht, daß die Komponenten derartiger Strukturen standardmäßig als public betrachtet werden.
Die Elementliste kann sowohl in C als auch in C++ eine beliebige Folge von Deklarationen enthalten, wobei es hier hinsichtlich der Komplexität und der verwendeten Daten- bzw. Funktionstypen keine Einschränkungen gegenüber globalen Deklarationen gibt.
Zusätzlich ist innerhalb von Strukturen die Deklaration von Bitfeldern möglich:
integertyp [Bezeichner] : konstanter-Ausdruck
Beispiele:
struct person { /* deklariert den Strukturtyp person */
int alter;
float gewicht;
char name[25];
} adam, eva; /* deklariert Variable des Typs person */
struct person paul; /* deklariert weitere Variable des Typs person */
person paula; /* Deklaration nur in C++ zulaessig bzw.
in C nach vorherigem typedef */
paul.alter = 13; /* Zuweisung von Werten an die */
paul.gewicht = 47.8; /* einzelnen Komponenten */
Beispiel:
#include <stdio.h>
int main(void)
{
struct person {
char name[20];
char vorname[20];
int alter;
} p1, p2;
struct person pp = { "Krause", "Anton", 44 };
printf("%s %s ist %d Jahre alt\n", pp.vorname, pp.name, pp.alter);
strcpy(p1.name, "Meier");
strcpy(p1.vorname, "Otto");
p1.alter = 77;
p2 = p1;
printf("%s %s ist %d Jahre alt\n", p2.vorname, p2.name, p2.alter);
return 0;
}
Strukturvariablen können bei ihrer Definition initialisiert werden.
Beispiel:
struct point /* deklariert den Strukturtyp point */
{
int x;
int y;
} pkt1 = { 20, 40 }; /* definiert die Variable pkt1 und initialisiert
ihre beiden Felder (x = 20, y = 40) */
struct point pkt2 = { 10, 12 };
Eine Strukturvariable darf auf der linken Seite einer Zuweisung stehen.
struct point pkt1 = { 2, 3 };
struct point pkt2;
pkt2 = pkt1;
Beispiel für eine Struktur aus dem C-Laufzeitsystem (time.h):
struct tm {
int tm_sec, /* seconds 0..59 */
tm_min, /* minutes 0..59 */
tm_hour, /* hour of day 0..23 */
tm_mday, /* day of month 1..31 */
tm_mon, /* month 0..11 */
tm_year, /* years since 1900 */
tm_wday, /* day of week, 0..6 (Sunday..Saturday) */
tm_yday, /* day of year, 0..365 */
tm_isdst; /* >0 if daylight savings time */
/* ==0 if not DST */
/* <0 if don't know */
};
Beispiel für Funktionen, die einen Wert mit Strukturtyp zurückgeben:
struct complx {
double re;
double im;
};
struct complx init(double r, double i)
{
struct complx new;
new.re = r;
new.im = i;
return new;
}
struct complx add(struct complx a, struct complx b)
{
struct complx c;
c.re = a.re + b.re;
c.im = a.im + b.im;
return c;
}
struct complx mult(struct complx a, struct complx b)
{
struct complx c;
c.re = a.re * b.re - a.im * b.im;
c.im = a.re * b.im + a.im * b.re;
return c;
}
void print(struct complx c)
{
printf("( %f , %f )\n", c.re, c.im);
}
Siehe auch: