**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 *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. Mõnedes sarnastes keeltes on aritmeetika *pointeritega* 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

```

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

1. 1 2  "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-d 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.