Pereiti prie turinio

Rodyklė (programavime)

Straipsnis iš Vikipedijos, laisvosios enciklopedijos.

Rodyklė (angl. pointer) – dalyje programavimo kalbų (C, C++, Pascal) sutinkama duomenų struktūra, leidžianti tiesiogiai ir efektyviai dirbti su kompiuterio atmintimi, dažnai kritiškiausiu ir labiausiai trūkstamu resursu. Rodyklė suteikia galimybę tiesiogiai pasiekti kompiuterio atminties ląsteles ir manipuliuoti jų turiniu. Kartais tai leidžia kurti daug greitesnį ir mažiau atminties reikalaujantį kodą. Tačiau teisingas rodyklių naudojimas reikalauja nemažai atidumo ir patirties, galimos rimtos, bet neakivaizdžios programavimo klaidos, todėl daugelis naujesnių programavimo kalbų (Java, C#, Python, JavaScript) šios duomenų struktūros nebeturi.[1]

Klasikinis rodyklės tipas

[redaguoti | redaguoti vikitekstą]

Fiziškai visa kompiuterio atmintis gali būti suprantama kaip didelis vienodo tipo (baito) masyvas ar vektorius. Gretimi šio masyvo nariai kartu gali saugoti daugiau vietos reikalaujančio tipo reikšmę. Rodyklė saugo šio didelio masyvo indeksą (fizinį adresą). Rodykles palaikančiose programavimo kalbose nesunku gauti rodyklę į bet kurio kintamojo vietą atmintyje. Pavyzdžiui, C++ galimi tokie sakiniai:

int skaičius = 89; // Sveikasis skaičius
int *pSkaičius = &skaičius; // Rodyklė į skaičių
int pKita = pSkaičius; // Kita rodyklė į tą pačią atminties vietą
*pKita = 50; // skaičius įgauna reikšmę 50.

int kitas = 90; // Kitas, nesusijęs kintamasis
pKita = &kitas; // 'pKita' dabar rodo į 90 ir nebėra niekuo susijusi su 'skaičius'.

*pKitas = 91; // 'kitas' pasikeičia į 91, bet 'skaičius' lieka su reikšme 50

Rodyklių naudojimas dažnai susijęs su atminties suteikimo funkcijomis. Pavyzdžiui, C yra malloc(dydis) funkcija, išskirianti norimo dydžio atminties sritį bei grąžinanti rodyklę į ją. Tokioje srityje galima saugoti struktūrą, kur, be kitų duomenų, laikoma viena ar daugiau rodyklių, rodančių į dar kitas ta pačia funkcija suteiktas sritis. Taip sukuriami bet kokie norimo (iš anksto nežinomo) ilgio sąrašai ar šakotos struktūros (medžiai ir pan). Tačiau programuotojas turi taip pat parašyti kodą nebereikalingai struktūrai panariui atsikratyti. To nepadarius, įvyksta atminties nutekėjimas – dažnai neakivaizdi ir sunkiai randama programavimo klaida.

Rodyklės taip pat naudojamos didelės apimties parametrams (vektoriams ir pan) į procedūras ar funkcijas perduoti, taip pat ten apskaičiuotai reikšmei grąžinti. Pavyzdžiui, rūšiavimo procedūrai taip galima labai paprastai perduoti bet kokio ilgio sąrašą, jei tik ir ilgis nurodytas.

Šiuo metu C++ turi kitą, saugesnę duomenų struktūrą, paprastai vadinamą nuoroda (angl. reference). Nuorodai iškart turi būti priskirta reikšmė (adresas kintamojo, į kurį ji rodo), ir vėliau ta reikšmė negali būti keičiama. Įprastinė rodyklė gali rodyti į įvairius kintamuosius, arba ir į jokį (angl. null). Yra triukų į nieką nerodančiai nuorodai sukurti, tačiau praktiniame programavime jų vengiama.

  int skaičius = 89; // Sveikasis skaičius
  int &rSkaičius = skaičius; // Rodyklė į kintamąjį 'skaičius'

  int &rKita = rSkaičius; // Kita rodyklė į tą pačią atminties vietą
  rKita = 50; // skaičius įgauna reikšmę 50.

  int kitas = 90; // Kitas kintamasis
  rKita = kitas; // 'pKita' nerodo i 'kitas', vietoj to kintamajam 'skaičius' priskiriama reikšmė 90

  kitas = 91; // 'skaičius' lieka su reikšme 90

Rimtas apribojimas yra nuorodų masyvų draudimas. Be to, nuoroda įprastai rodo į statiškai aprašytą kintamąjį, kuriam skirtos atminties išskyrimu ir atsikratymu labai rūpintis nereikia. Dėl šių apribojimų nuoroda rodyklę pakeičia ne visur.

Senesniuose kompiuteriuose rodyklė ar nuoroda iš tiesų galėjo būti panaudota bet kuriai atminties ląstelei perskaityti ar jos turiniui pakeisti. Šiuolaikiniai procesoriai kiekvienai programai nustato atminties ribas, kurias peržengus programa iškart sustabdoma. Todėl su rodyklėmis ar nuorodomis susijusios klaidos pastebimos greičiau ir dažniausiai neturi įtakos visos operacinės sistemos ar kitų programų darbui.

  1. C++ Programming Language Pointers, References and Dynamic Memory Allocation ntu.edu.sg