Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lernen Zeiger in Strukturen | Arbeiten mit Zeigern und Strukturen
C-Strukturen Meistern

bookZeiger in Strukturen

Wichtige Datenstrukturen wie Stacks, verkettete Listen und Bäume können Verweise auf andere Objekte desselben Typs enthalten, um Verbindungen oder Beziehungen zwischen Elementen herzustellen. Datenstrukturen werden später in diesem Kurs behandelt.

Note
Hinweis

Elemente solcher Datenstrukturen werden üblicherweise als Knoten bezeichnet.

Wenn versucht wird, eine Struktur zu erstellen, die ein Feld desselben Typs wie die Struktur selbst enthält, tritt ein Fehler auf:

struct Node {
    int data;
    struct Node next; // error: `Node` structure contains itself
};

In diesem Fall tritt eine unendliche Rekursion auf, wenn die Größe einer solchen Struktur bestimmt wird.

Dieses Konzept kann durch die Verwendung eines Zeigers auf eine Struktur umgesetzt werden:

struct Node {
    int data;
    struct Node *next; // pointer to the `Node` structure
};

Dieser Code funktioniert, weil der Compiler die genaue Größe eines Zeigers kennt — üblicherweise 4 oder 8 Byte, abhängig vom System.
Er versucht nicht, die Größe der gesamten verschachtelten Struktur zu berechnen; stattdessen speichert er lediglich eine Referenz (address) darauf.

Schauen wir uns an, wie dies in der Praxis funktioniert.

main.c

main.c

copy
1234567891011121314151617181920212223242526
#include <stdio.h> struct Node { char name[20]; struct Node* next; }; int main() { struct Node Kate = { "Kate" }; struct Node Tom = { "Tom" }; struct Node Bob = { "Bob" }; Kate.next = &Tom; // Kate --> Tom Tom.next = &Bob; // Tom --> Bob // set a pointer to the first structure in the chain struct Node* pointer = &Kate; while (pointer != NULL) { printf("Address: %p | Name: %s-> | Next address: %p\n", pointer, pointer->name, pointer->next); pointer = pointer->next; // go to the next object } return 0; }

struct Node kate = { "Kate" }; - das Feld next wurde im Struktinitialisierer nicht explizit initialisiert, daher wird es automatisch mit einem Nullzeiger (NULL) initialisiert, da dies der Standardwert für Zeiger ist, wenn sie auf kein Objekt zeigen.

while (pointer != NULL) - die Schleife läuft, bis der Zeiger auf die NULL-Adresse zeigt.

Note
Hinweis

In Programmiersprachen wie C und C++ bedeutet ein Zeiger, der NULL ist, in der Regel das Ende einer Liste (oder einer anderen Datenstruktur). Daher wird diese Schleife ausgeführt, bis pointer NULL ist, was als Erreichen des Endes der Liste oder Datenstruktur interpretiert werden kann.

question mark

Warum können wir keine Struktur erstellen, die sich selbst enthält?

Select the correct answer

War alles klar?

Wie können wir es verbessern?

Danke für Ihr Feedback!

Abschnitt 2. Kapitel 3

Fragen Sie AI

expand

Fragen Sie AI

ChatGPT

Fragen Sie alles oder probieren Sie eine der vorgeschlagenen Fragen, um unser Gespräch zu beginnen

Suggested prompts:

Can you explain why using a pointer solves the recursion problem?

What are some real-world examples of using linked lists or similar structures?

Can you show how to traverse a linked list in C?

bookZeiger in Strukturen

Swipe um das Menü anzuzeigen

Wichtige Datenstrukturen wie Stacks, verkettete Listen und Bäume können Verweise auf andere Objekte desselben Typs enthalten, um Verbindungen oder Beziehungen zwischen Elementen herzustellen. Datenstrukturen werden später in diesem Kurs behandelt.

Note
Hinweis

Elemente solcher Datenstrukturen werden üblicherweise als Knoten bezeichnet.

Wenn versucht wird, eine Struktur zu erstellen, die ein Feld desselben Typs wie die Struktur selbst enthält, tritt ein Fehler auf:

struct Node {
    int data;
    struct Node next; // error: `Node` structure contains itself
};

In diesem Fall tritt eine unendliche Rekursion auf, wenn die Größe einer solchen Struktur bestimmt wird.

Dieses Konzept kann durch die Verwendung eines Zeigers auf eine Struktur umgesetzt werden:

struct Node {
    int data;
    struct Node *next; // pointer to the `Node` structure
};

Dieser Code funktioniert, weil der Compiler die genaue Größe eines Zeigers kennt — üblicherweise 4 oder 8 Byte, abhängig vom System.
Er versucht nicht, die Größe der gesamten verschachtelten Struktur zu berechnen; stattdessen speichert er lediglich eine Referenz (address) darauf.

Schauen wir uns an, wie dies in der Praxis funktioniert.

main.c

main.c

copy
1234567891011121314151617181920212223242526
#include <stdio.h> struct Node { char name[20]; struct Node* next; }; int main() { struct Node Kate = { "Kate" }; struct Node Tom = { "Tom" }; struct Node Bob = { "Bob" }; Kate.next = &Tom; // Kate --> Tom Tom.next = &Bob; // Tom --> Bob // set a pointer to the first structure in the chain struct Node* pointer = &Kate; while (pointer != NULL) { printf("Address: %p | Name: %s-> | Next address: %p\n", pointer, pointer->name, pointer->next); pointer = pointer->next; // go to the next object } return 0; }

struct Node kate = { "Kate" }; - das Feld next wurde im Struktinitialisierer nicht explizit initialisiert, daher wird es automatisch mit einem Nullzeiger (NULL) initialisiert, da dies der Standardwert für Zeiger ist, wenn sie auf kein Objekt zeigen.

while (pointer != NULL) - die Schleife läuft, bis der Zeiger auf die NULL-Adresse zeigt.

Note
Hinweis

In Programmiersprachen wie C und C++ bedeutet ein Zeiger, der NULL ist, in der Regel das Ende einer Liste (oder einer anderen Datenstruktur). Daher wird diese Schleife ausgeführt, bis pointer NULL ist, was als Erreichen des Endes der Liste oder Datenstruktur interpretiert werden kann.

question mark

Warum können wir keine Struktur erstellen, die sich selbst enthält?

Select the correct answer

War alles klar?

Wie können wir es verbessern?

Danke für Ihr Feedback!

Abschnitt 2. Kapitel 3
some-alt