Zugriff auf Strukturelemente
Nach oben zu Strukturen - Index
Auf Struktur- und Variantenelemente kann über die folgenden beiden Auswahloperatoren zugegriffen werden:
- . (Punkt)
- -> (Pfeil nach rechts)
Ist beispielsweise das Objekt s vom Strukturtyp S, und sptr ein Zeiger auf S. Wenn m nun ein Element-Bezeichner vom Typ M ist, der in S deklariert ist, dann sind die Ausdrücke s.m und sptr->m vom Typ M. Beide stellen das Elementobjekt m in S dar. Der Ausdruck sptr->m steht für (*sptr).m.
Der Operator . ist der direkte und der Operator -> ist der indirekte (oder Zeiger-) Zugang zu Strukturelementen. Ein Beispiel:
struct mystruct { int i; char str[21]; double d; } s, *sptr = &s; . . . s.i = 3; // dem Element i von mystruct s einen Wert zuweisen sptr -> d = 1.23; // dem Element d von mystruct s einen Wert zuweisen
Der Ausdruck s.m ist unter der Bedingung ein L-Wert, dass s ein L-Wert und m kein Array ist. Der Ausdruck sptr->m ist nur dann ein L-Wert, wenn m kein Array ist.
Wenn die Struktur B ein Feld enthält, das vom Typ Struktur A ist, dann gibt es zwei verschiedene Möglichkeiten, auf die Elemente von A zuzugreifen:
struct A { int j; double x; }; struct B { int i; struct A a; double d; } s, *sptr; . . . s.i = 3; // dem Element i von B einen Wert zuweisen s.a.j = 2; // dem Element j von A einen Wert zuweisen sptr->d = 1.23; // dem Element d von B einen Wert zuweisen sptr->a.x = 3.14 // dem Element x von A einen Wert zuweisen
Jede Strukturdeklaration führt einen eigenen Strukturtyp ein. So sind durch die Definitionen
struct A { int i,j; double d; } a, a1; struct B { int i,j; double d; } b;
beide Objekte a und a1 Strukturen vom Typ A, aber die Typen der Objekte a und b sind verschieden. Strukturen können einander nur dann zugewiesen werden, wenn Quelle und Ziel denselben Typ haben:
a = a1; // OK: derselbe Typ, deshalb Elementweise Zuordnung a = b; // UNGÜLTIG verschiedene Typen a.i = b.i; a.j = b.j; a.d = b.d /* aber Sie können die Elemente einzeln zuweisen */