Sobes.tech
Junior

Mis on viidetüübid?

sobes.tech AI

Vastus AI-lt

Viitamissüsteemi andmetüübid ei hoia väärtust ise, vaid viidet (aadressi mälus) kohta, kus see väärtus asub.

Omadused:

  • Viidetüüpi muutujad võivad sisaldada null.
  • Kui ühe viidetüüpi muutuja väärtus antakse teisele, kopeeritakse mitte väärtus ise, vaid viide. Mõlemad muutujad hakkavad osutama samale mälukoha aadressile.
  • Muudatused, mis tehakse ühe viite kaudu, on nähtavad teise kaudu, kui mõlemad osutavad samale objektile.
  • Mäluhaldus nende viidetüüpi objektide jaoks toimub prügikoristaja (garbage collector) poolt.

Näited viidetüüpidest:

  • Stringid (String)
  • Massiivid
  • Kasutaja klasside objektid
  • Delegaadid (mõnedes keeltes)

Erinevus väärtustüüpidest:

Omadus Väärtustüübid Viidetüübid
Salvestus Oma väärtus Viide väärtusele
Kopeerimine Kopeeritakse väärtus ise Kopeeritakse viide
Muutmine Muudatused koopias ei mõjuta algset Muudatused ühe viite kaudu on nähtavad teise kaudu, kui viitavad samale objektile
Mäluhaldus Hallatakse virna (stack) kaudu Hallatakse virna (heap), puhastatakse prügikoristaja poolt
Näited int, float, bool, struct (mõnedes keeltes) String, Array, Object
// Näide C#-s
string s1 = "Hello"; // s1 viitab stringile "Hello"
string s2 = s1;      // s2 viitab samale viitele nagu s1

// Muutused ei ole nähtavad teise viite kaudu,
// sest stringid on C#-s immutabilised. 
// Muutuse korral luuakse uus string ja viit ümber suunatakse.
s1 = "World"; 

Console.WriteLine(s2); // Kuvab "Hello"

int[] arr1 = { 1, 2, 3 }; // arr1 viitab massiivile {1, 2, 3}
int[] arr2 = arr1;     // arr2 viitab samale viitele

arr2[0] = 10;          // Muudatus arr2 kaudu

Console.WriteLine(arr1[0]); // Kuvab 10, muudatus on nähtav ka arr1 kaudu
// Näide Java-s
String s1 = "Hello"; // s1 viitab stringile "Hello"
String s2 = s1;      // s2 viitab samale viitele nagu s1

// Stringid Java-s on immutabilised.
// Muutuse korral luuakse uus string ja viit ümber suunatakse.
s1 = "World"; 

System.out.println(s2); // Kuvab "Hello"

int[] arr1 = { 1, 2, 3 }; // arr1 viitab massiivile {1, 2, 3}
int[] arr2 = arr1;     // arr2 viitab samale viitele

arr2[0] = 10;          // Muudatus arr2 kaudu

System.out.println(arr1[0]); // Kuvab 10, muudatus on nähtav ka arr1 kaudu