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
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
.
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
.
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;
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;
Osoitin synttarisankari
osoittaa nyt olioon henkilo1
. Mutta
seuraavan koodirivin suorittamisen jälkeen
synttarisankari = &henkilo2;
sama osoitin onkin kääntynyt osoittamaan olioon henkilo2
.
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.