Ensimmäinen katsaus osoittimiin

Tällä kierroksella olemme tutkineet vähän Pythonin viitteitä ja vähän enemmän C++:n viitteitä. Tarkkaavaisimmat ovat huomanneet, että Pythonin ja C++:n viitteet toimivat kuitenkin eri tavoin.

Pythonissa viitteeseen tehty sijoitus muuttaa sitä, mihin viite osoittaa:

henkilo1 = Henkilo("Kalle", 6)
henkilo2 = Henkilo("Ville", 5)
synttarisankari = henkilo1
../../_images/python_olioviite_1.png

Viite synttarisankari osoittaa nyt samaan olioon kuin viite henkilo1. Mutta seuraavan koodirivin suorittamisen jälkeen

synttarisankari = henkilo2

viite synttarisankari osoittaakin samaan olioon kuin viite henkilo2.

../../_images/python_olioviite_2.png

C++:ssa taas viitteeseen sijoittaminen muuttaa viitteen osoittaman kohteen arvoa:

int kokonaisluku = 42;
int& kokonaislukuviite = kokonaisluku;

kokonaislukuviite = 100;

Sijoitusten suorittamisen jälkeen muuttujan kokonaisluku arvo on 100, ja viite osoittaa edelleen muuttujaan kokonaisluku.

../../_images/viitekuva.png

C++:n viitteet ovat vakioita. Et siis voi kääntää C++:n viitettä osoittamaan uutta kohdetta, vaan se osoittaa koko ajan samaan paikkaan.

C++:ssa on myös toinen epäsuoraan osoittamiseen tarkoitettu tietotyyppi: osoitin. C++:n osoittimet toimivat hyvin samantyylisesti kuin Pythonin viitteet.

Kuten C++:n viitteille, myös osoittimille pitää määritellä, minkätyyppiseen muuttujaan ne osoittavat. Osoitin luodaan C++:ssa lisäämällä muuttujan määrittelyssä tietotyypin nimen ja muuttujan nimen väliin *-merkki. Osoitin alustetaan viittaamalla siihen muuttujaan, johon osoittimen halutaan osoittavan. Viittaus &muuttuja siis tuottaa osoittimen kyseiseen muuttujaan.

kohdetyyppi* muuttujan_nimi = &kohdemuuttuja;

esimerkiksi kokonaisluvuilla:

int kokonaisluku = 42;
int* kokonaislukuosoitin = &kokonaisluku;
../../_images/osoitinkuva.png

Osoitin on siis muuttuja, joka sisältää viitteen. Koska osoitin on muuttuja, sen osoittamaa arvoa voi myös vaihtaa:

Henkilo henkilo1("Kalle", 6);
Henkilo henkilo2("Ville", 5);
Henkilo* synttarisankari = &henkilo1;
../../_images/cpp_olioviite_1.png

Osoitin synttarisankari osoittaa nyt olioon henkilo1. Mutta seuraavan koodirivin suorittamisen jälkeen

synttarisankari = &henkilo2;

sama osoitin onkin kääntynyt osoittamaan olioon henkilo2.

../../_images/cpp_olioviite_2.png

Jos halutaan, että osoitin ei osoita minnekään, sen voi myös asettaa osoittamaan arvoa nullptr.

Tämä oli vain johdattelu käsitteeseen osoitin, eikä tätä ole tarkoitettu kattavaksi materiaaliksi aiheeseen. Seuraavassa tehtävässä on valmis pääohjelma, joka sisältää yhden osoitintyyppisen muuttujan. Vaikka pääohjelmaan ei tarvitsekaan tehdä mitään muutoksia, tutki silti pääohjelmaa esimerkkinä osoittimen käyttämisestä.

Osoittimia tarvitaan tällä opintojaksolla vielä useampaan erilaiseen tarkoitukseen, ja niiden toteutusyksityiskohtiin perehdytään myöhemmässä vaiheessa erittäin perusteellisesti.