Osoittimet Rakenteiden Sisällä
Keskeiset tietorakenteet, kuten pinot, linkitetyt listat ja puut, voivat sisältää viittauksia muihin saman tyyppisiin olioihin muodostaakseen yhteyksiä tai suhteita elementtien välille. Tietorakenteita käsitellään tarkemmin myöhemmin tällä kurssilla.
Tällaisten tietorakenteiden elementtejä kutsutaan yleensä solmuiksi.
Jos yrität luoda rakenteen, joka sisältää kentän, jonka tyyppi on sama kuin rakenteen itsensä, saat virheilmoituksen:
struct Node {
int data;
struct Node next; // error: `Node` structure contains itself
};
Tässä tapauksessa ääretön rekursio tapahtuu, kun tällaisen rakenteen kokoa määritetään.
Tämä ajatus 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ää osoittimen tarkan koon — yleensä 4 tai 8 tavua järjestelmästä riippuen.
Se ei yritä laskea koko sisäkkäisen rakenteen kokoa; se tallentaa vain viittauksen (address) siihen.
Tarkastellaan, 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 rakenteen alustajassa, se alustetaan automaattisesti null-osoittimeksi (NULL), sillä tämä on vakioarvo 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 pääsemiseksi.
Kiitos palautteestasi!
Kysy tekoälyä
Kysy tekoälyä
Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme
Mahtavaa!
Completion arvosana parantunut arvoon 4.35
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 muodostaakseen yhteyksiä tai suhteita elementtien välille. Tietorakenteita käsitellään tarkemmin myöhemmin tällä kurssilla.
Tällaisten tietorakenteiden elementtejä kutsutaan yleensä solmuiksi.
Jos yrität luoda rakenteen, joka sisältää kentän, jonka tyyppi on sama kuin rakenteen itsensä, saat virheilmoituksen:
struct Node {
int data;
struct Node next; // error: `Node` structure contains itself
};
Tässä tapauksessa ääretön rekursio tapahtuu, kun tällaisen rakenteen kokoa määritetään.
Tämä ajatus 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ää osoittimen tarkan koon — yleensä 4 tai 8 tavua järjestelmästä riippuen.
Se ei yritä laskea koko sisäkkäisen rakenteen kokoa; se tallentaa vain viittauksen (address) siihen.
Tarkastellaan, 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 rakenteen alustajassa, se alustetaan automaattisesti null-osoittimeksi (NULL), sillä tämä on vakioarvo 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 pääsemiseksi.
Kiitos palautteestasi!