Oliot, osoittimet ja taulukot

Muisti ja muistiosoitteet


Tutustutaan seuraavaksi hyvin yleisellä tasolla ja yksinkertaistaen siihen, mitä tietokoneen keskusmuisti on. Ohjelman käsittelemä tieto on suorituksen aikana keskusmuistissa ainakin jossakin vaiheessa.*

Muistia voi ajatella jonona numeroituja lokeroita:

Tietokoneen muisti kuvattuna numeroitujen lokeroiden jonona
Muisti voidaan hahmottaa jonona numeroituja lokeroita.

Jokaiseen lokeroon prosessori voi tallentaa pienen määrän tietoa. Yhtä lokeroa kutsutaan muistipaikaksi ja sen järjestysnumeroa muistiosoitteeksi.

Tavuja ja bittejä muistissa

Tässä yksinkertaistetussa mallissa muistipaikkaan mahtuu yksi tavu (byte), joka koostuu kahdeksasta bitistä. Tietokone käsittelee muistia tavallisesti tavua suurempina kokonaisuuksina.

Yhteen muistipaikkaan mahtuu siis tieto, jonka esittämiseen riittää 8 bittiä, kuten tavallisesti yksi char. Jos tietotyyppi tarvitsee enemmän bittejä, sen esitykseen käytetään useita peräkkäisiä muistipaikkoja.

Jos int-tyyppi on 32-bittinen ja tavussa on 8 bittiä, kokonaisluku vie neljä tavua:

32-bittinen kokonaisluku tallennettuna neljään peräkkäiseen muistipaikkaan
32-bittinen kokonaisluku vie neljä tavua, kun tavussa on 8 bittiä.

Vastaavasti 64-bittinen double tarvitsee kahdeksan tavua:

64-bittinen liukuluku tallennettuna kahdeksaan peräkkäiseen muistipaikkaan
64-bittinen liukuluku vie kahdeksan tavua, kun tavussa on 8 bittiä.

Samoihin muistipaikkoihin voidaan eri aikoina tallentaa eri tyyppistä tietoa. Koska tietokoneen muistissa kaikki esitetään bitteinä, pelkkä bittijono ei kerro, miten arvo pitäisi tulkita. Tieto tarvitsee tyypin, jotta sitä osataan käsitellä oikein.

Muuttuja ja sen muistiosoite

C++:ssa muuttujan määrittely antaa nimen ohjelmassa käsiteltävälle arvolle. Kääntäjä huolehtii siitä, että arvo saa tarvitsemansa tallennustilan ja että sen tyyppi tunnetaan. Yksinkertaistetussa muistimallissa muuttujan nimen ajatellaan viittaavan niihin muistipaikkoihin, joihin sen arvo on tallennettu.

Esimerkiksi kokonaislukumuuttuja määritellään näin:

int luku;

Kääntäjä varaa muuttujalle sen tarvitseman tallennustilan:

Muistipaikkoja varattuna kokonaislukumuuttujalle
Muuttujalle varataan sen tyypin tarvitsema määrä muistipaikkoja.

Kun ohjelmakoodissa käytetään nimeä luku, sillä tarkoitetaan muuttujan arvoa. Ohjelman suoritusmalli, optimoinnit ja käytettävä ympäristö voivat vaikuttaa siihen, miten arvo käytännössä sijoitetaan, mutta muistiosoite tarjoaa hyödyllisen perusmallin osoittimien ymmärtämiseen.

Muista nämä käsitteet

  • Muistipaikka sisältää tallennetun tiedon.
  • Muistiosoite yksilöi muistipaikan.
  • Muuttuja on ohjelmakoodissa käytettävä nimi tyypitetyille tiedoille.
  • Muuttujaan liittyy tallennuspaikka ja siten myös muistiosoite tämän yksinkertaistetun mallin mukaan.*

Tämä ei ole koko kuvaus tietokoneen muistista: esimerkiksi kaikkia ohjelman arvoja ei välttämättä sijoiteta yksinkertaisesti nimettyihin muistipaikkoihin. Perusidea riittää kuitenkin osoitteiden ja osoittimien jatkokäsittelyyn.