Zeiger 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.
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
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.
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.
Danke für Ihr Feedback!
Fragen Sie AI
Fragen Sie AI
Fragen Sie alles oder probieren Sie eine der vorgeschlagenen Fragen, um unser Gespräch zu beginnen
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?
Großartig!
Completion Rate verbessert auf 4.35
Zeiger 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.
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
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.
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.
Danke für Ihr Feedback!