logo

C-Strukturen

Die Struktur in C ist ein benutzerdefinierter Datentyp, der verwendet werden kann, um Elemente möglicherweise unterschiedlicher Typen in einem einzigen Typ zu gruppieren. Der struct-Schlüsselwort wird verwendet, um die Struktur in der Programmiersprache C zu definieren. Die Elemente in der Struktur werden als „its“ bezeichnet Mitglied und sie können von jedem gültigen Datentyp sein.

C-Strukturen

C-Strukturdeklaration

Wir müssen die Struktur in C deklarieren, bevor wir sie in unserem Programm verwenden können. Bei der Strukturdeklaration geben wir ihre Mitgliedsvariablen zusammen mit ihrem Datentyp an. Wir können das Schlüsselwort struct verwenden, um die Struktur in C mit der folgenden Syntax zu deklarieren:



Syntax

 struct structure_name { data_type member_name1;  data_type member_name1; .... .... };>

Die obige Syntax wird auch als Strukturvorlage oder Strukturprototyp bezeichnet und der Struktur wird in der Deklaration kein Speicher zugewiesen.

C-Strukturdefinition

Um die Struktur in unserem Programm verwenden zu können, müssen wir ihre Instanz definieren. Das können wir erreichen, indem wir Variablen vom Typ Struktur erstellen. Wir können Strukturvariablen mit zwei Methoden definieren:

1. Strukturvariablendeklaration mit Strukturvorlage

 struct structure_name { data_type member_name1; data_type member_name1; .... .... }  variable1, varaible2, ...  ;>

2. Strukturvariablendeklaration nach Strukturvorlage

// structure declared beforehand struct structure_name  variable1, variable2  , .......;>

Auf Strukturmitglieder zugreifen

Wir können auf Strukturmitglieder zugreifen, indem wir verwenden ( . ) Punktoperator.



Syntax

structure_name.member1; strcuture_name.member2;>

Wenn wir einen Zeiger auf die Struktur haben, können wir auch den Pfeiloperator verwenden, um auf die Mitglieder zuzugreifen.

Strukturelemente initialisieren

Strukturmitglieder kann nicht sein mit der Deklaration initialisiert. Das folgende C-Programm schlägt beispielsweise bei der Kompilierung fehl.

struct Point { int x = 0; // COMPILER ERROR: cannot initialize members here int y = 0; // COMPILER ERROR: cannot initialize members here };>

Der Grund für den oben genannten Fehler ist einfach. Wenn ein Datentyp deklariert wird, wird ihm kein Speicher zugewiesen. Speicher wird nur zugewiesen, wenn Variablen erstellt werden.



Wir können Strukturmitglieder auf drei Arten initialisieren:

  1. Zuweisungsoperator verwenden.
  2. Verwenden der Initialisierungsliste.
  3. Verwendung der designierten Initialisierungsliste.

1. Initialisierung mit Zuweisungsoperator

 struct structure_name str; str.member1 = value1; str.member2 = value2; str.member3 = value3; . . .>

2. Initialisierung mithilfe der Initialisierungsliste

 struct structure_name str = { value1, value2, value3 };>

Bei dieser Art der Initialisierung werden die Werte in der Reihenfolge zugewiesen, in der sie in der Strukturvorlage deklariert sind.

3. Initialisierung mithilfe der Designated Initializer List

Durch die designierte Initialisierung können Strukturmitglieder in beliebiger Reihenfolge initialisiert werden. Diese Funktion wurde im C99-Standard hinzugefügt.

 struct structure_name str = { .member1 = value1, .member2 = value2, .member3 = value3 };>

Die Designated Initialization wird nur in C, nicht jedoch in C++ unterstützt.

Beispiel einer Struktur in C

Das folgende C-Programm zeigt, wie Strukturen verwendet werden

C




// C program to illustrate the use of structures> #include> > // declaring structure with name str1> struct> str1 {> >int> i;> >char> c;> >float> f;> >char> s[30];> };> > // declaring structure with name str2> struct> str2 {> >int> ii;> >char> cc;> >float> ff;> } var;>// variable declaration with structure template> > // Driver code> int> main()> {> >// variable declaration after structure template> >// initialization with initializer list and designated> >// initializer list> >struct> str1 var1 = { 1,>'A'>, 1.00,>'techcodeview.com'> },> >var2;> >struct> str2 var3 = { .ff = 5.00, .ii = 5, .cc =>'a'> };> > >// copying structure using assignment operator> >var2 = var1;> > >printf>(>'Struct 1: i = %d, c = %c, f = %f, s = %s '>,> >var1.i, var1.c, var1.f, var1.s);> >printf>(>'Struct 2: i = %d, c = %c, f = %f, s = %s '>,> >var2.i, var2.c, var2.f, var2.s);> >printf>(>'Struct 3 i = %d, c = %c, f = %f '>, var3.ii,> >var3.cc, var3.ff);> > >return> 0;> }>

>

>

Ausgabe

Struct 1: i = 1, c = A, f = 1.000000, s = techcodeview.com Struct 2: i = 1, c = A, f = 1.000000, s = techcodeview.com Struct 3 i = 5, c = a, f = 5.000000>

typedef für Strukturen

Der Typdefinition Mit dem Schlüsselwort wird ein Alias ​​für den bereits vorhandenen Datentyp definiert. In Strukturen müssen wir das Schlüsselwort struct zusammen mit dem Strukturnamen verwenden, um die Variablen zu definieren. Manchmal erhöht dies die Länge und Komplexität des Codes. Wir können die Typedef verwenden, um einen neuen kürzeren Namen für die Struktur zu definieren.

Beispiel

C




// C Program to illustrate the use of typedef with> // structures> #include> > // defining structure> struct> str1 {> >int> a;> };> > // defining new name for str1> typedef> struct> str1 str1;> > // another way of using typedef with structures> typedef> struct> str2 {> >int> x;> } str2;> > int> main()> {> >// creating structure variables using new names> >str1 var1 = { 20 };> >str2 var2 = { 314 };> > >printf>(>'var1.a = %d '>, var1.a);> >printf>(>'var2.x = %d'>, var2.x);> > >return> 0;> }>

>

>

Ausgabe

var1.a = 20 var2.x = 314>

Verschachtelte Strukturen

Die Sprache C ermöglicht es uns, eine Struktur als Mitglied in eine andere einzufügen. Dieser Vorgang wird als Verschachtelung bezeichnet und solche Strukturen werden als verschachtelte Strukturen bezeichnet. Es gibt zwei Möglichkeiten, eine Struktur in eine andere zu verschachteln:

1. Verschachtelung eingebetteter Strukturen

Bei dieser Methode wird die verschachtelte Struktur auch innerhalb der übergeordneten Struktur deklariert.

Beispiel

struct parent { int member1; struct member_str member2 { int member_str1; char member_str2; ... } ... }>

2. Separate Strukturverschachtelung

Bei dieser Methode werden zwei Strukturen separat deklariert und dann wird die Mitgliedsstruktur in der übergeordneten Struktur verschachtelt.

Beispiel

struct member_str { int member_str1; char member_str2; ... } struct parent { int member1; struct member_str member2; ... }>

Hierbei ist zu beachten, dass die Deklaration der Struktur immer vor ihrer Definition als Strukturmitglied vorhanden sein sollte. Zum Beispiel die Die nachstehende Erklärung ist ungültig da die Struktur mem nicht definiert ist, wenn sie innerhalb der übergeordneten Struktur deklariert wird.

struct parent { struct mem a; }; struct mem { int var; };>

Auf verschachtelte Mitglieder zugreifen

Wir können auf verschachtelte Mitglieder zugreifen, indem wir denselben Punktoperator ( . ) zweimal verwenden, wie gezeigt:

 str_parent.str_child .member;>

Beispiel für Strukturverschachtelung

C




// C Program to illustrate structure nesting along with> // forward declaration> #include> > // child structure declaration> struct> child {> >int> x;> >char> c;> };> > // parent structure declaration> struct> parent {> >int> a;> >struct> child b;> };> > // driver code> int> main()> {> >struct> parent var1 = { 25, 195,>'A'> };> > >// accessing and printing nested members> >printf>(>'var1.a = %d '>, var1.a);> >printf>(>'var1.b.x = %d '>, var1.b.x);> >printf>(>'var1.b.c = %c'>, var1.b.c);> > >return> 0;> }>

>

>

Ausgabe

var1.a = 25 var1.b.x = 195 var1.b.c = A>

Strukturzeiger in C

Wir können einen Zeiger definieren, der wie jede andere Variable auf die Struktur zeigt. Solche Zeiger werden im Allgemeinen aufgerufen Strukturzeiger . Mit dem können wir auf die Mitglieder der Struktur zugreifen, auf die der Strukturzeiger zeigt ( -> ) Pfeiloperator.

Beispiel für einen Strukturzeiger

C


Latextisch



// C program to illustrate the structure pointer> #include> > // structure declaration> struct> Point {> >int> x, y;> };> > int> main()> {> >struct> Point str = { 1, 2 };> > >// p2 is a pointer to structure p1> >struct> Point* ptr = &str;> > >// Accessing structure members using structure pointer> >printf>(>'%d %d'>, ptr->x, ptr->y);> > >return> 0;> }>

>

>

Ausgabe

1 2>

Selbstreferenzielle Strukturen

Die selbstreferenziellen Strukturen in C sind solche Strukturen, die Verweise auf denselben Typ wie sie selbst enthalten, d. h. sie enthalten ein Mitglied des Typzeigers, der auf denselben Strukturtyp zeigt.

Beispiel für selbstreferenzielle Strukturen

 struct structure_name { data_type member1;  data_type member2;  struct structure_name* str;  }>

C




// C program to illustrate the self referential structures> #include> > // structure template> typedef> struct> str {> >int> mem1;> >int> mem2;> >struct> str* next;> }str;> > // driver code> int> main()> {> >str var1 = { 1, 2, NULL };> >str var2 = { 10, 20, NULL };> > >// assigning the address of var2 to var1.next> >var1.next = &var2;> > >// pointer to var1> >str *ptr1 = &var1;> > >// accessing var2 members using var1> >printf>(>'var2.mem1: %d var2.mem2: %d'>, ptr1->next->mem1,> >ptr1->next->mem2);> > >return> 0;> }>

>

>

Ausgabe

var2.mem1: 10 var2.mem2: 20>

Solche Arten von Strukturen werden in verschiedenen Datenstrukturen verwendet, beispielsweise zum Definieren der Knoten verknüpfter Listen, Bäume usw.

C-Strukturpolsterung und -verpackung

Technisch gesehen sollte die Größe der Struktur in C die Summe der Größen ihrer Mitglieder sein. In den meisten Fällen trifft dies jedoch möglicherweise nicht zu. Der Grund dafür ist Structure Padding.

Strukturpolsterung ist das Konzept, der Struktur mehrere leere Bytes hinzuzufügen, um die Datenelemente im Speicher auf natürliche Weise auszurichten. Dies geschieht, um die CPU-Lesezyklen zum Abrufen verschiedener Datenelemente in der Struktur zu minimieren.

Es gibt Situationen, in denen wir die Struktur dicht packen müssen, indem wir die leeren Bytes entfernen. In solchen Fällen verwenden wir Strukturverpackung. Die C-Sprache bietet zwei Möglichkeiten zum Strukturpacken:

  1. Verwenden von #pragma pack(1)
  2. Verwenden von __attribute((packed))__

Beispiel für Strukturpolsterung und -verpackung

C




// C program to illustrate structure padding and packing> #include> > // structure with padding> struct> str1 {> >char> c;> >int> i;> };> > struct> str2 {> >char> c;> >int> i;> } __attribute((packed)) __;>// using structure packing> > // driver code> int> main()> {> > >printf>(>'Size of str1: %d '>,>sizeof>(>struct> str1));> >printf>(>'Size of str2: %d '>,>sizeof>(>struct> str2));> >return> 0;> }>

>

>

Ausgabe

Size of str1: 8 Size of str2: 5>

Wie wir sehen können, variiert die Größe der Struktur, wenn die Strukturpackung durchgeführt wird.

Weitere Informationen zum Auffüllen und Packen von Strukturen finden Sie in diesem Artikel. Bitfelder werden verwendet, um die Länge der Strukturelemente in Bits anzugeben. Wenn wir die maximale Länge des Mitglieds kennen, können wir Bitfelder verwenden, um die Größe anzugeben und den Speicherverbrauch zu reduzieren.

Syntax von Bitfeldern

struct structure_name  { data_type member_name : width_of_bit-field; };>

Beispiel für Bitfelder

C




// C Program to illustrate bit fields in structures> #include> > // declaring structure for reference> struct> str1 {> >int> a;> >char> c;> };> > // structure with bit fields> struct> str2 {> >int> a : 24;>// size of 'a' is 3 bytes = 24 bits> >char> c;> };> > // driver code> int> main()> {> >printf>(>'Size of Str1: %d Size of Str2: %d'>,> >sizeof>(>struct> str1),>sizeof>(>struct> str2));> >return> 0;> }>

>

>

Ausgabe

Size of Str1: 8 Size of Str2: 4>

Wie wir sehen können, wird die Größe der Struktur reduziert, wenn das Bitfeld verwendet wird, um die maximale Größe des Mitglieds „a“ zu definieren.

Verwendung der Struktur in C

C-Strukturen werden für Folgendes verwendet:

  1. Die Struktur kann verwendet werden, um die benutzerdefinierten Datentypen zu definieren, die zum Erstellen einiger komplexer Datentypen wie Datumsangaben, Uhrzeiten, komplexe Zahlen usw. verwendet werden können, die in der Sprache nicht vorhanden sind.
  2. Es kann auch in der Datenorganisation verwendet werden, wo große Datenmengen in verschiedenen Feldern gespeichert werden können.
  3. Mit Strukturen werden Datenstrukturen wie Bäume, verknüpfte Listen usw. erstellt.
  4. Sie können auch zum Zurückgeben mehrerer Werte von einer Funktion verwendet werden.

Einschränkungen von C-Strukturen

In der Sprache C stellen Strukturen eine Methode zum Zusammenpacken von Daten unterschiedlicher Typen dar. Eine Struktur ist ein hilfreiches Werkzeug zum Umgang mit einer Gruppe logisch zusammengehöriger Datenelemente. Allerdings weisen C-Strukturen auch einige Einschränkungen auf.

    Höherer Speicherverbrauch: Dies liegt an der Strukturauffüllung. Kein Ausblenden von Daten: C-Strukturen erlauben kein Ausblenden von Daten. Auf Strukturelemente kann von jeder Funktion überall im Bereich der Struktur zugegriffen werden. Funktionen innerhalb der Struktur: C-Strukturen erlauben keine Funktionen innerhalb der Struktur, daher können wir die zugehörigen Funktionen nicht bereitstellen. Statische Mitglieder: Die C-Struktur kann keine statischen Mitglieder in ihrem Körper haben. Konstruktionserstellung in Structure: Strukturen in C können keinen Konstruktor innerhalb von Structures haben.

In Verbindung stehende Artikel

  • C-Strukturen vs. C++-Struktur