Struktur (Datentyp)

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

  1. 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.
  2. 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
  3. struct In: "C++ Reference"-Wiki online (in englischer Sprache)

Siehe auch

Weblinks

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

Wikimedia Foundation.

Игры ⚽ Нужно решить контрольную?

Schlagen Sie auch in anderen Wörterbüchern nach:

  • Struktur — Unter Struktur (von lat.: structura = ordentliche Zusammenfügung, Bau, Zusammenhang; bzw. lat.: struere = schichten, zusammenfügen) versteht man das Muster von Systemelementen und ihrer Wirk Beziehungen (Relationen) untereinander, also die Art… …   Deutsch Wikipedia

  • Struktur — Überbau; Aufbau; Gerüst; Oberbau; Gliederung; Form; Gefüge; Organisation; Konsistenz; Beschaffenheit; Anordnung; Geflecht; …   Universal-Lexikon

  • Datentyp — Formal bezeichnet ein Datentyp in der Informatik die Zusammenfassung von Objektmengen mit den darauf definierten Operationen. Dabei werden durch den Datentyp des Datensatzes unter Verwendung einer so genannten Signatur ausschließlich die Namen… …   Deutsch Wikipedia

  • Verbund (Datentyp) — Ein Verbund (engl. object composition) ist ein aus Komponenten verschiedener Datentypen zusammengesetzter Datentyp. Da die Komponenten eines Verbunds wieder Verbünde sein können, können so auch komplexe Datenstrukturen definiert werden. Es gibt… …   Deutsch Wikipedia

  • Ordinaler Datentyp — Formal bezeichnet ein Datentyp in der Informatik die Zusammenfassung von Objektmengen mit den darauf definierten Operationen. Dabei werden durch den Datentyp des Datensatzes unter Verwendung einer so genannten Signatur ausschließlich die Namen… …   Deutsch Wikipedia

  • Primitiver Datentyp — Formal bezeichnet ein Datentyp in der Informatik die Zusammenfassung von Objektmengen mit den darauf definierten Operationen. Dabei werden durch den Datentyp des Datensatzes unter Verwendung einer so genannten Signatur ausschließlich die Namen… …   Deutsch Wikipedia

  • Abstrakter Datentyp — Ein Abstrakter Datentyp (ADT) ist ein Verbund von Daten zusammen mit der Definition aller zulässigen Operationen, die auf sie zugreifen. Inhaltsverzeichnis 1 Beschreibung 2 Spezifikationen 3 Beispiel 3.1 …   Deutsch Wikipedia

  • Union-Find-Struktur — Eine Union Find Datenstruktur verwaltet die Partition einer Menge. Der abstrakte Datentyp wird durch die Menge der drei Operationen {Union, Find, Make Set} gebildet. Union Find Strukturen dienen zur Verwaltung von Zerlegungen in disjunkte Mengen …   Deutsch Wikipedia

  • Sprachelemente von C-Sharp — Dieser Artikel bietet eine Übersicht einiger Sprachelemente von C#. Inhaltsverzeichnis 1 Bedingte Ausführung (if, else, switch) 2 Schleifen (for, do, while, foreach) 3 Die Sprunganweisungen break, c …   Deutsch Wikipedia

  • Syntax von C-Sharp — Dieser Artikel bietet eine Übersicht einiger Sprachelemente von C#. Inhaltsverzeichnis 1 Bedingte Ausführung (if, else, switch) 2 Schleifen (for, do, while, foreach) 3 Die Sprungbefehle break, continue, goto und return 4 Die using Anweisung …   Deutsch Wikipedia

Share the article and excerpts

Direct link
Do a right-click on the link above
and select “Copy Link”