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 
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.

Pointeri puhul on sageli võimalik ka pointer'i-aritmeetika, mille puhul on viitadega võimalik teha matemaatilisi tehteid – peamiselt liitmist ja lahutamist – ning pointer võib olla ka nullviit. C keeles on pointer'itega tehete tegemine loomulik viis ligi pääseda loendite elementidele, kuigi üldjuhul toimub see tehe läbi [] operaatori. Mõnedes sarnastes keeltes on aritmeetika pointer'itega keelatud, näiteks Go puhul. 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.

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).

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

 Viidad keeltes C ja C++ 
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
{| class="wikitable"
! 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;
{| class="wikitable"
! Muutuja !! Aadress !! Väärtus
|-
| a || 0x8130 || 0x00000006
|-
| b || 0x8134 || 0x00000003
|-
| p || 0x8138 || 0x00008130
|}
Viida enda väärtust muutes saab viidata teistele muutujatele.
p = &b;
{| class="wikitable"
! Muutuja !! Aadress !! Väärtus
|-
| a || 0x8130 || 0x00000006
|-
| b || 0x8134 || 0x00000003
|-
| p || 0x8138 || 0x00008134
|}
Viida kaudu saab ka lugeda viidatavaid muutujaid.
a = *p;
{| class="wikitable"
! Muutuja !! Aadress !! Väärtus
|-
| a || 0x8130 || 0x00000003
|-
| b || 0x8134 || 0x00000003
|-
| p || 0x8138 || 0x00008134
|}

 Viited 

Kategooria:Andmetüübid

sv:Datatyp#Pekare och referenstyper