Pekare Inuti Strukturer
Viktiga datastrukturer såsom stackar, länkade listor och träd kan innehålla referenser till andra objekt av samma typ för att skapa kopplingar eller relationer mellan element. Datastrukturer kommer att behandlas senare i denna kurs.
Element i sådana datastrukturer kallas vanligtvis noder.
Om du försöker skapa en struktur som innehåller ett fält av samma typ som strukturen själv, kommer du att få ett fel:
struct Node {
int data;
struct Node next; // error: `Node` structure contains itself
};
I detta fall uppstår en oändlig rekursion när storleken på en sådan struktur ska bestämmas.
Denna idé kan implementeras med hjälp av en pekare till en struktur:
struct Node {
int data;
struct Node *next; // pointer to the `Node` structure
};
Denna kod fungerar eftersom kompilatorn känner till den exakta storleken på en pekare — vanligtvis 4 eller 8 byte, beroende på systemet.
Den försöker inte beräkna storleken på hela den nästlade strukturen; den lagrar helt enkelt en referens (address) till den.
Låt oss se hur detta fungerar i praktiken.
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" }; - eftersom fältet next inte initialiserades explicit i strukturens initialiserare, kommer det automatiskt att initialiseras till en nullpekare (NULL), eftersom detta är standardvärdet för pekare när de inte pekar på något objekt.
while (pointer != NULL) - loopen kommer att köras tills pekaren pekar på adressen NULL.
I programmeringsspråk som C och C++ betyder en pekare som är NULL vanligtvis slutet på en lista (eller annan datastruktur). Därför kommer denna loop att köras tills pekaren är NULL, vilket kan tolkas som att slutet på listan eller datastrukturen har nåtts.
Tack för dina kommentarer!
Fråga AI
Fråga AI
Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal
Fantastiskt!
Completion betyg förbättrat till 4.35
Pekare Inuti Strukturer
Svep för att visa menyn
Viktiga datastrukturer såsom stackar, länkade listor och träd kan innehålla referenser till andra objekt av samma typ för att skapa kopplingar eller relationer mellan element. Datastrukturer kommer att behandlas senare i denna kurs.
Element i sådana datastrukturer kallas vanligtvis noder.
Om du försöker skapa en struktur som innehåller ett fält av samma typ som strukturen själv, kommer du att få ett fel:
struct Node {
int data;
struct Node next; // error: `Node` structure contains itself
};
I detta fall uppstår en oändlig rekursion när storleken på en sådan struktur ska bestämmas.
Denna idé kan implementeras med hjälp av en pekare till en struktur:
struct Node {
int data;
struct Node *next; // pointer to the `Node` structure
};
Denna kod fungerar eftersom kompilatorn känner till den exakta storleken på en pekare — vanligtvis 4 eller 8 byte, beroende på systemet.
Den försöker inte beräkna storleken på hela den nästlade strukturen; den lagrar helt enkelt en referens (address) till den.
Låt oss se hur detta fungerar i praktiken.
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" }; - eftersom fältet next inte initialiserades explicit i strukturens initialiserare, kommer det automatiskt att initialiseras till en nullpekare (NULL), eftersom detta är standardvärdet för pekare när de inte pekar på något objekt.
while (pointer != NULL) - loopen kommer att köras tills pekaren pekar på adressen NULL.
I programmeringsspråk som C och C++ betyder en pekare som är NULL vanligtvis slutet på en lista (eller annan datastruktur). Därför kommer denna loop att köras tills pekaren är NULL, vilket kan tolkas som att slutet på listan eller datastrukturen har nåtts.
Tack för dina kommentarer!