Pointers Binnen Structs
Essentiële datastructuren zoals stapels, gekoppelde lijsten en bomen kunnen verwijzingen bevatten naar andere objecten van hetzelfde type om verbindingen of relaties tussen elementen te creëren. Datastructuren worden later in deze cursus behandeld.
Elementen van dergelijke datastructuren worden meestal knooppunten genoemd.
Als je probeert een structuur te maken die een veld bevat van hetzelfde type als de structuur zelf, krijg je een foutmelding:
struct Node {
int data;
struct Node next; // error: `Node` structure contains itself
};
In dit geval treedt er een oneindige recursie op bij het bepalen van de grootte van zo'n structuur.
Dit concept kan worden geïmplementeerd met behulp van een pointer naar een structuur:
struct Node {
int data;
struct Node *next; // pointer to the `Node` structure
};
Deze code werkt omdat de compiler de exacte grootte van een pointer kent — meestal 4 of 8 bytes, afhankelijk van het systeem.
De compiler probeert niet de grootte van de volledige geneste structuur te berekenen; hij slaat eenvoudigweg een referentie (address) ernaar op.
Laten we bekijken hoe dit in de praktijk werkt.
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" }; - het veld next werd niet expliciet geïnitialiseerd in de struct-initializer; het wordt automatisch geïnitialiseerd als een null-pointer (NULL), aangezien dit de standaardwaarde is voor pointers wanneer ze nergens naar verwijzen.
while (pointer != NULL) - de lus wordt uitgevoerd totdat de pointer naar het NULL-adres wijst.
In programmeertalen zoals C en C++ betekent een pointer die NULL is meestal het einde van een lijst (of andere datastructuur). Daarom wordt deze lus uitgevoerd totdat pointer NULL is, wat geïnterpreteerd kan worden als het bereiken van het einde van de lijst of datastructuur.
Bedankt voor je feedback!
Vraag AI
Vraag AI
Vraag wat u wilt of probeer een van de voorgestelde vragen om onze chat te starten.
Geweldig!
Completion tarief verbeterd naar 4.35
Pointers Binnen Structs
Veeg om het menu te tonen
Essentiële datastructuren zoals stapels, gekoppelde lijsten en bomen kunnen verwijzingen bevatten naar andere objecten van hetzelfde type om verbindingen of relaties tussen elementen te creëren. Datastructuren worden later in deze cursus behandeld.
Elementen van dergelijke datastructuren worden meestal knooppunten genoemd.
Als je probeert een structuur te maken die een veld bevat van hetzelfde type als de structuur zelf, krijg je een foutmelding:
struct Node {
int data;
struct Node next; // error: `Node` structure contains itself
};
In dit geval treedt er een oneindige recursie op bij het bepalen van de grootte van zo'n structuur.
Dit concept kan worden geïmplementeerd met behulp van een pointer naar een structuur:
struct Node {
int data;
struct Node *next; // pointer to the `Node` structure
};
Deze code werkt omdat de compiler de exacte grootte van een pointer kent — meestal 4 of 8 bytes, afhankelijk van het systeem.
De compiler probeert niet de grootte van de volledige geneste structuur te berekenen; hij slaat eenvoudigweg een referentie (address) ernaar op.
Laten we bekijken hoe dit in de praktijk werkt.
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" }; - het veld next werd niet expliciet geïnitialiseerd in de struct-initializer; het wordt automatisch geïnitialiseerd als een null-pointer (NULL), aangezien dit de standaardwaarde is voor pointers wanneer ze nergens naar verwijzen.
while (pointer != NULL) - de lus wordt uitgevoerd totdat de pointer naar het NULL-adres wijst.
In programmeertalen zoals C en C++ betekent een pointer die NULL is meestal het einde van een lijst (of andere datastructuur). Daarom wordt deze lus uitgevoerd totdat pointer NULL is, wat geïnterpreteerd kan worden als het bereiken van het einde van de lijst of datastructuur.
Bedankt voor je feedback!