Viit (informaatika)

Viit (inglise keeles pointer) on informaatikas muutuja, mille väärtus on mäluaadress. Viit tavaliselt viitab mõnele teise muutujale.

Viitasid kasutatakse näiteks siis, kui andmeid jagatakse programmi erinevate osade vahel, aga andmete kopeerimine on kulukas. Sel juhul on otstarbekas edastada vaid viit ehk mäluaadress, kus andmed paiknevad.

Viit ei pruugi alati viidata olemasolevale mälupesale. Seega tuleb hoolikalt jälgida, et viit oleks kasutamisel õigesti väärtustatud. Kõrgema taseme keeled (nt. Java ja Python) väldivad viitade kasutamist, sest olematu või vale mälupesa lugemine või kirjutamine võib programmi kokku jooksutada.

Et vältida väärtustamata viida kasutamist, antakse viidale tihti algväärtus 0. Seda nimetatakse nullviidaks (inglise k. null pointer). Enamikus süsteemides võib eeldada, et mäluaadressi 0 ei kasutata. Nullviidaga saab märkida ka näiteks listi lõppu või objekti puudumist.

Pointer ja reference muuda

Inglise keeles kasutatakse sõnu pointer ja reference sageli samatähenduslikult, aga mõnedes programmeerimiskeeltes tehakse neil vahet. Nimelt madalatasemelistes keeltes, millel puudub prügikoguja (näiteks C, C++ ja Rust), tähendab pointer sageli väärtust, mis esindab mäluaadressi, ning reference kõrgematasemelist viidet või aliast teisele objektile.[1]

Pointeri puhul on sageli võimalik ka pointeri-aritmeetika, mille puhul on viitadega võimalik teha matemaatilisi tehteid – peamiselt liitmist ja lahutamist – ning pointer võib olla ka nullviit. C keeles on pointeritega tehete tegemine loomulik viis ligi pääseda loendite elementidele, kuigi üldjuhul toimub see tehe läbi [] operaatori.[2] Mõnedes sarnastes keeltes on aritmeetika pointeritega keelatud, näiteks Go puhul.[3] Reference on saadaval näiteks C++i ja Rusti keeltes, kus ta viitab otseselt antud tüüpi objektile. Reference ei ole kunagi null ning selle objekti aadressi esindava arvväärtusega ei ole võimalik teha aritmeetilisi tehteid.[1]

Prügikogujatega keeltes on sageli kõik muutujad vaikimisi viidad. Keeltes nagu Java ja C# on võimalik neid määrata ka nullviitadeks, ning nende kasutamine tõstatab erandi (näiteks Java puhul on selleks NullPointerException).[4]

Cybernetica andmekaitse- ja infoportaal esitab sõna "pointer" eestikeelseks vasteks sõna "viit",[5] ning sõna "reference" eestikeelseks vasteks sõna "viide", ehkki nendib, et viimase puhul on tegemist poolkeelse mugandusega.[6]

Viidad keeltes C ja C++ muuda

Programmeerimiskeeltes C ja C++ defineeritakse viit tärni (*) abil, mis asub muutuja tüübi ja nime vahel. Iga viit on seotud kindla andmetüübiga. Sümbol & muutuja nime ees tähistab selle aadressi.

int a = 2;    // a ja b on täisarvu tüüpi muutujad
int b = 3;
int *p = &a;  // p on viit muutujale a
Muutuja Address Väärtus
a 0x8130 0x00000002
b 0x8134 0x00000003
p 0x8138 0x00008130

Viida kaudu saab muuta viidatava muutuja väärtust. Tärn viida ees tähendabki, et kasutatakse viidatavat muutujat.

*p = 6;
Muutuja Aadress Väärtus
a 0x8130 0x00000006
b 0x8134 0x00000003
p 0x8138 0x00008130

Viida enda väärtust muutes saab viidata teistele muutujatele.

p = &b;
Muutuja Aadress Väärtus
a 0x8130 0x00000006
b 0x8134 0x00000003
p 0x8138 0x00008134

Viida kaudu saab ka lugeda viidatavaid muutujaid.

a = *p;
Muutuja Aadress Väärtus
a 0x8130 0x00000003
b 0x8134 0x00000003
p 0x8138 0x00008134

Viited muuda

  1. 1,0 1,1 "References, Standard C++". isocpp.org. Vaadatud 5. veebruaril 2024.
  2. Plauger, P J; Brodie, Jim (1992). ANSI and ISO Standard C Programmer's Reference. Redmond, WA: Microsoft Press. Lk 108, 51. ISBN 978-1-55615-359-4.
  3. "A Tour of Go – Pointers". go.dev. Vaadatud 5. veebruaril 2024.
  4. "NullPointerException (Java Platform SE 8 )". docs.oracle.com. Vaadatud 5. veebruaril 2024.
  5. "pointer (2) - AKIT". akit.cyber.ee. Vaadatud 5. veebruaril 2024.
  6. "reference (4) - AKIT". akit.cyber.ee. Vaadatud 5. veebruaril 2024.