Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Oppiskele Osoittimet Rakenteiden Sisällä | Työskentely Pointtereiden ja Rakenteiden Kanssa
C-Rakenteet

Osoittimet Rakenteiden Sisällä

Pyyhkäise näyttääksesi valikon

Keskeiset tietorakenteet, kuten pinot, linkitetyt listat ja puut, voivat sisältää viittauksia muihin saman tyyppisiin olioihin luodakseen yhteyksiä tai suhteita alkioiden välille. Tietorakenteita käsitellään tarkemmin myöhemmin tällä kurssilla.

Note
Huomio

Tällaisten tietorakenteiden alkioita kutsutaan yleensä solmuiksi.

data+structures

Jos yrität luoda rakenteen, joka sisältää kentän, jonka tyyppi on sama kuin rakenteen itsensä, saat virheen:

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

Tässä tapauksessa syntyy ääretön rekursio, kun tällaisen rakenteen kokoa määritetään.

Tämä voidaan toteuttaa käyttämällä osoitinta rakenteeseen:

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

Tämä koodi toimii, koska kääntäjä tietää tarkalleen osoittimen koon — yleensä 4 tai 8 tavua järjestelmästä riippuen.
Kääntäjä ei yritä laskea koko sisäkkäisen rakenteen kokoa, vaan tallentaa vain viitteen (address) siihen.

Katsotaanpa, miten tämä toimii käytännössä.

main.c

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" }; – koska next-kenttää ei alustettu eksplisiittisesti rakenteen alustajassa, se alustetaan automaattisesti null-osoittimeksi (NULL), sillä tämä on oletusarvo osoittimille, kun ne eivät osoita mihinkään olioon.

while (pointer != NULL) – silmukka suoritetaan, kunnes osoitin osoittaa NULL-osoitteeseen.

Note
Huomio

Ohjelmointikielissä kuten C ja C++ osoitin, jonka arvo on NULL, tarkoittaa yleensä listan (tai muun tietorakenteen) loppua. Tämän vuoksi silmukka suoritetaan, kunnes pointer on NULL, mikä voidaan tulkita listan tai tietorakenteen loppuun saapumiseksi.

question mark

Miksi emme voi luoda rakennetta, joka sisältää itsensä?

Valitse oikea vastaus

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 2. Luku 3

Kysy tekoälyä

expand

Kysy tekoälyä

ChatGPT

Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme

Osio 2. Luku 3
some-alt