Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lära Pekare Inuti Strukturer | Arbeta med Pekare och Strukturer
Practice
Projects
Quizzes & Challenges
Quizzes
Challenges
/
Behärska C-Strukturer

bookPekare 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.

Note
Notering

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

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" }; - 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.

Note
Notera

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.

question mark

Varför kan vi inte skapa en struktur som innehåller sig själv?

Select the correct answer

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 2. Kapitel 3

Fråga AI

expand

Fråga AI

ChatGPT

Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal

bookPekare 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.

Note
Notering

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

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" }; - 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.

Note
Notera

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.

question mark

Varför kan vi inte skapa en struktur som innehåller sig själv?

Select the correct answer

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 2. Kapitel 3
some-alt