- Struktur (Datentyp)
-
Der Datentyp Struktur (engl. structure) bezeichnet einen Verbund. Durch seine Fähigkeit andere Variablen verschiedener Datentypen zu umfassen, kann eine Struktur zu übersichtlicherem und dynamischem Quelltext verhelfen.
Inhaltsverzeichnis
Eigenschaften
Speichergröße
Die Größe einer Struktur ist nicht notwendigerweise identisch mit der Summe der Größe der Attribute dieser Struktur; dies ist betriebssystemspezifisch: Da der Zugriff auf Variablen mit geraden Speicheradressen hardwaremäßig schneller zugegriffen werden kann, legt das Betriebssystem eine passende Anzahl von Bytes zwischen den Speicheradressen der Attribute der Struktur.
Dynamische Größe?
Die Speichergröße einer Struktur kann (im Gegensatz zu allokierten Arrays) zur Laufzeit nicht verändert werden, wodurch auch die Anzahl und die Typen der Attribute aller Strukturen dauerhaft unveränderlich bleibt.
Abgrenzung
Unterscheidung zwischen C-Array und C-Struktur
In C besteht der entscheidende Unterschied zwischen Arrays und Strukturen darin, dass Arrays nur Variablen eines Typs beinhalten können und Strukturen fähig sind eine ganze Palette an verschiedenen Datentypen zu umfassen.
Unterscheidung zwischen C-Struktur und C-Union
Unions sind Strukturen sehr ähnlich. Der Hauptunterschied zwischen Strukturen und Unions liegt darin, dass die Attribute einer Union den selben Speicherplatz bezeichnen. Deshalb benötigt eine Union-Variable nur genau soviel Speicherplatz, wie ihr jeweils größtes Element.[1]Weil das meistens unerwünscht ist, werden Strukturen häufiger genutzt als Unions.
Unterscheidung zwischen C++- und C-Struktur
In C können Strukturen lediglich Variablen, Zeiger, Arrays und andere Strukturen enthalten, während Strukturen in C++ die zusätzliche Fähigkeit besitzen, Funktionen - sogenannte Methoden - zu beinhalten, zu denen auch Konstruktoren und Destruktoren gehören.[2] Dies lässt sich in C nur zum Teil über Zeiger auf Funktionen realisieren, welche allerdings sehr wohl Teil von Strukturen sein können.
Unterscheidung zwischen C++-Struktur und C++-Klasse
Der nicht zu vernachlässigende Unterschied zwischen C++-Strukturen und C++-Klassen besteht darin, dass die Attribute von Strukturen unveränderlicherweise immer public sind[3], also von beliebigen Funktionen verändert und angesehen werden können. Dagegen kann man die Attribute einer Klasse mit den Schlüsselwörtern "public" öffentlich machen bzw. "private" privatisieren, wobei letzteres bedeutet, dass nur explizit in der Klasse definierte Methoden auf die Attribute zugreifen können.
Programmierung
Im Folgenden wird die Programmierung von Strukturen in der Praxis anhand von C-Quelltext-Ausschnitten beschrieben.
Deklaration
Deklaration einer Struktur
Die Deklaration von Strukturen ist sehr simpel. Sie erfolgt über das Schlüsselwort struct:
struct StrukturName;
Dabei wurde eine Struktur mit dem Namen StrukturName deklariert.
Deklaration einer Struktur-Variable
Um eine Struktur-Variable zu deklarieren, muss die Struktur dieser Struktur-Variable zuvor definiert worden sein, damit das Betriebssystem bzw. der Compiler weiß, wie viel Speicher die Struktur-Variable benötigt. Danach kann die Struktur-Variable folgendermaßen deklariert werden:
struct StrukturName StrukturVariablenName;
Definition
Im Gegensatz zur Deklaration einer Struktur müssen bei der Definition alle Attribute deklariert werden (– definiert werden können sie allerdings nicht). Diese werden in einer geschweiften Klammer nach dem Struktur-Namen aufgezählt, wobei das Semikolon nach der schließenden geschweiften Klammer beachtet werden muss:
struct StrukturName { int ErstesAttribut; char *ZweitesAttribut; float DrittesAttribut; };
Damit wäre eine Struktur mit dem Namen StrukturName samt ihrer Attribute definiert. Eine Struktur kann selbst verständlich auch eine andere Struktur als Attribut beinhalten – mit der Bedingung, dass diese zuvor deklariert wurde. Beispiel:
/* Ohne diese Deklaration (bzw. diesen sog. "Prototypen") gäbe es einen Fehler beim Kompilieren: */ struct StrukturName1; struct StrukturName2 { /* Definition einer Struktur-Variable als Attribut einer Struktur: */ struct StrukturName1 StrukturVariable__ErstesAttribut; }; /* StrukturName1 muss noch definiert werden ... */
Zeitgleiche Definition einer Struktur und einer Struktur-Variable
Um zeitgleich zur Definition einer Struktur Struktur-Variablen zu deklarieren bzw. definieren, wird der Name der Struktur-Variablen zwischen der schließenden geschweiften Klammer und dem abschließenden Semikolon – durch Kommas getrennt – notiert. Z.B.:
struct StrukturName { int i[4]; float f; char c; } StrukturVariable1, StrukturVariable2, StrukturVariable3;
Initialisierung
Die allgemeine Initialisierung einer Struktur-Variable erfolgt entweder durch die Initialisierung jedes Attributes einzeln, wobei mit dem Punktoperator "." auf die einzelnen Attribute der Struktur zugegriffen wird:
/* Definition der Struktur: */ struct StrukturName { int i; char c; }; /* Deklaration der Struktur-Variable: */ struct StrukturName StrukturVariablenName; /* Initialisierung der Struktur-Variable: */ StrukturVariablenName.i = 1; StrukturVariablenName.c = 'x';
Oder man nimmt sich erlaubtermaßen die geschweifte Klammer zur Hilfe:
/* Definition der Struktur: */ struct StrukturName { int i; char c; }; /* Initialisierung der Struktur-Variable: */ struct StrukturName StrukturVariablenName1 = { 1, 'a' }; struct StrukturName StrukturVariablenName2 = { .c = 'b', .i = 312 };
Hier muss allerdings die Reihenfolge der Attribute der Struktur notwendigerweise mit in Betracht gezogen werden, oder der Attributname wird explizit erwähnt.
Zeitgleiche Definition einer Struktur und Initialisierung einer Struktur-Variable
Außerdem bieten C und C++ die Möglichkeit zeitgleich zur Definition einer Struktur eine Struktur-Variable diesen Typs zu initialisieren:
struct StrukturName { double d; int i; } StrukturVariable1 = { 1.1, 55}, StrukturVariable2 = { .i = 1234, .d = 31.22 };
typedef und Strukturen
Mit der Anweisung typedef lässt sich in den C-basierten Programmiersprachen die Übersichtlichkeit des Quellcodes verbessern, da es dadurch möglich wird, bei der Deklaration von Struktur-Variablen auf das Schlüsselwort struct zu verzichten. Beispielsweise so:
/* Definition einer Struktur: */ struct StrukturName { int i; int j; }; /* Typ-Definition mit typedef: */ typedef StrukturName TypName; /* Übersichtliche Deklaration einer Struktur-Variable: */ TypName StrukturVariablenName;
Das ganze kann allerdings verkürzt werden, in dem man parallel zur Definition der Struktur diese sofort mit typedef versieht. Das funktioniert dann so:
/* Typ-Definition parallel zur Definition einer Struktur: */ typedef struct StrukturName { int i; int j; } TypName; /* Übersichtliche Deklaration einer Struktur-Variable: */ TypName StrukturVariablenName1; /* Zum Vergleich: Deklaration einer Struktur-Variable ohne "typedef": */ struct StrukturName StrukturVariablenName2;
Außerdem kann man parallel zur Typ-Definition einer Struktur auch Struktur-Variablen deklarieren oder definieren. Wichtig ist, dass der Typ-Name als letztes zwischen der schließenden Klammer und dem Semikolon geschrieben werden muss:
typedef struct StrukturName { int i; int j; } /* Deklaration einer Struktur-Variable: */ StrukturVariable1, /* Definition zweier Struktur-Variablen: */ StrukturVariable2 = { 1, 1243 }, StrukturVariable3 = { j = 314159, i = 0 }, /* und als letztes der: */ TypName;
Der Pfeiloperator
In C/C++ kann der Pfeiloperator "
->
" zur Vereinfachung genutzt werden, um auf die Attribute einer Struktur-Variable zuzugreifen, auf die ein Pointer zeigt. Dazu ein vollständiges Beispiel-Programm:/* Definition der Struktur: */ struct StrukturName { int i; int j; } /* Definition einer Struktur-Variable: */ StrukturVariable = { 0, 0 }, /* Initialisierung eines Zeigers auf die zuvor definierte Struktur-Variable: */ *StrukturVariablenZeiger = &StrukturVariable; // // Hauptprogramm // int main (void) { /* Zugriff mittels dem Punktoperator ".": */ (*StrukturVariablenZeiger).i = 1234; /* Übersichtlicher: Mit dem Pfeiloperator "->": */ StrukturVariablenZeiger->j = 4321; }
Einzelnachweise
- ↑ http://openbook.galileocomputing.de/c_von_a_bis_z/015_c_strukturen_009.htm, Jürgen Wolf: C von A bis Z, Kapitel 15: Strukturen, Unterkapitel 15.9: Unions. Galileo Computing.
- ↑ Unterschiede des Datentyps "class" zum Datentyp "struct" In: Kapitel 12: Objektorientiertes Programmieren in C++; Kursmaterialien - Online-Medien der Philipps-Universität Marburg; letzte Änderung: 20. März 2009
- ↑ struct In: "C++ Reference"-Wiki online (in englischer Sprache)
Siehe auch
Weblinks
Wikibooks: C-Programmierung:_Komplexe_Datentypen – Lern- und Lehrmaterialien- Jürgen Wolf: C von A bis Z. Typendefinition mit »typedef«. Galileo Computing, abgerufen am 30. Januar 2011 (HTML, deutsch).
- Dr. P. Böhme: C/C++ - Datentyp struct. Martin-Luther-Universität Halle-Wittenberg, Fachbereich Mathematik und Informatik, 15. Februar 1996, abgerufen am 31. Januar 2011 (HTML, deutsch): „Strukturen (Records) fassen verschiedene Komponenten zusammen. Im allgemeinen besitzen die Komponenten unterschiedliche Datentypen...“
- Martin Leslie: C Referenz -Strukturen. abgerufen am 31. Januar 2011 (HTML, deutsch, übersetzt von G. Junghanns): „struct wird verwendet, um einen neuen (nutzerdefinierten) Datentyp einzuführen. In Strukturen kann man Variablen verschiedenen Datentyps zu einer Einheit zusammenfassen...“
- Arnold Willemer: Der Datenverbund: struct. Willemers Informatik-Ecke. In: Einstieg in C++. Galileo Computing, abgerufen am 31. Januar 2011 (HTML, deutsch).
- Klaus Wachtler: struct und union. Eine Einführung in die Programmierung mit ANSI-C. 4. Oktober 2002, abgerufen am 31. Januar 2011 (HTML, deutsch).
Kategorien:- Datentyp
- Programmiersprache C
- Programmiersprache C++
Wikimedia Foundation.