Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lære Pekere Inne i Strukturer | Arbeide med Pekere og Strukturer
Mestre C-strukturer

bookPekere Inne i Strukturer

Viktige datastrukturer som stakker, lenkede lister og trær kan inneholde referanser til andre objekter av samme type for å opprette forbindelser eller relasjoner mellom elementene. Datastrukturer vil bli gjennomgått senere i dette kurset.

Note
Merk

Elementer i slike datastrukturer kalles vanligvis noder.

Hvis du prøver å opprette en struktur som inneholder et felt av samme type som strukturen selv, vil du få en feil:

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

I dette tilfellet oppstår en uendelig rekursjon når størrelsen på en slik struktur skal bestemmes.

Denne ideen kan implementeres ved å bruke en peker til en struktur:

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

Denne koden fungerer fordi kompilatoren kjenner den nøyaktige størrelsen på en peker — vanligvis 4 eller 8 byte, avhengig av systemet.
Den prøver ikke å beregne størrelsen på hele den nestede strukturen; den lagrer bare en referanse (address) til den.

La oss se hvordan dette fungerer i praksis.

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" }; – feltet next ble ikke eksplisitt initialisert i struktur-initialiseringen, og vil derfor automatisk bli satt til en nullpeker (NULL), siden dette er standardverdien for pekere når de ikke peker til noe objekt.

while (pointer != NULL) – løkken vil kjøre så lenge pekeren ikke peker til NULL-adressen.

Note
Merk

I programmeringsspråk som C og C++ betyr en peker som er NULL vanligvis slutten på en liste (eller annen datastruktur). Derfor vil denne løkken kjøre til pekeren er NULL, noe som kan tolkes som at slutten på listen eller datastrukturen er nådd.

question mark

Hvorfor kan vi ikke lage en struktur som inneholder seg selv?

Select the correct answer

Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 2. Kapittel 3

Spør AI

expand

Spør AI

ChatGPT

Spør om hva du vil, eller prøv ett av de foreslåtte spørsmålene for å starte chatten vår

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?

bookPekere Inne i Strukturer

Sveip for å vise menyen

Viktige datastrukturer som stakker, lenkede lister og trær kan inneholde referanser til andre objekter av samme type for å opprette forbindelser eller relasjoner mellom elementene. Datastrukturer vil bli gjennomgått senere i dette kurset.

Note
Merk

Elementer i slike datastrukturer kalles vanligvis noder.

Hvis du prøver å opprette en struktur som inneholder et felt av samme type som strukturen selv, vil du få en feil:

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

I dette tilfellet oppstår en uendelig rekursjon når størrelsen på en slik struktur skal bestemmes.

Denne ideen kan implementeres ved å bruke en peker til en struktur:

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

Denne koden fungerer fordi kompilatoren kjenner den nøyaktige størrelsen på en peker — vanligvis 4 eller 8 byte, avhengig av systemet.
Den prøver ikke å beregne størrelsen på hele den nestede strukturen; den lagrer bare en referanse (address) til den.

La oss se hvordan dette fungerer i praksis.

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" }; – feltet next ble ikke eksplisitt initialisert i struktur-initialiseringen, og vil derfor automatisk bli satt til en nullpeker (NULL), siden dette er standardverdien for pekere når de ikke peker til noe objekt.

while (pointer != NULL) – løkken vil kjøre så lenge pekeren ikke peker til NULL-adressen.

Note
Merk

I programmeringsspråk som C og C++ betyr en peker som er NULL vanligvis slutten på en liste (eller annen datastruktur). Derfor vil denne løkken kjøre til pekeren er NULL, noe som kan tolkes som at slutten på listen eller datastrukturen er nådd.

question mark

Hvorfor kan vi ikke lage en struktur som inneholder seg selv?

Select the correct answer

Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 2. Kapittel 3
some-alt