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.
Tällaisten tietorakenteiden alkioita kutsutaan yleensä solmuiksi.
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
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.
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.
Kiitos palautteestasi!
Kysy tekoälyä
Kysy tekoälyä
Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme