Osutaja vs massiiv
Osuti on andmetüüp, mis sisaldab viidet mälukohale (st osuti muutuja salvestab selle mälukoha aadressi, kuhu on salvestatud mõned andmed). Massiivid on kõige sagedamini kasutatav andmestruktuur elementide kogumi salvestamiseks. Enamik programmeerimiskeeli pakuvad meetodeid massiivide hõlpsaks deklareerimiseks ja massiivi elementidele juurdepääsuks.
Mis on osuti?
Osuti on andmetüüp, mis salvestab selle mälukoha aadressi, kuhu mõned andmed on salvestatud. Teisisõnu, kursor sisaldab viidet mälukohale. Juurdepääsu mäluasukohta salvestatud andmetele, millele kursor viitab, nimetatakse viitamise tühistamiseks. Korduvate toimingute (nt puude/stringide läbimine, tabeliotsing jne) sooritamisel parandaks osutite kasutamine jõudlust. Selle põhjuseks on asjaolu, et viitamise tühistamine ja viidete kopeerimine on odavam kui osutitega näidatud andmete tegelik kopeerimine ja juurdepääs. Nullkursor on osuti, mis ei osuta millelegi. Javas tekitaks nullkursorile juurdepääs erandi nimega NullPointerException.
Mis on massiiv?
Joonisel 1 kujutatud kooditükk, mida tavaliselt kasutatakse massiivi väärtuste deklareerimiseks ja määramiseks. Joonisel 2 on kujutatud, kuidas massiiv mälus välja näeks.
int väärtused[5]; values[0]=100; values[1]=101; values[2]=102; values[3]=103; values[4]=104; |
Joonis 1: Massiivi väärtuste deklareerimise ja määramise kood
100 | 101 | 102 | 103 | 104 |
Indeks: 0 | 1 | 2 | 3 | 4 |
Joonis 2: Mällu salvestatud massiiv
Ülevalpool olev kood määratleb massiivi, mis suudab salvestada 5 täisarvu ja millele pääseb juurde indeksite 0 kuni 4 abil. Massiivi üks oluline omadus on see, et kogu massiiv eraldatakse ühe mäluplokina ja iga element saab oma oma ruum massiivis. Kui massiiv on määratletud, on selle suurus fikseeritud. Seega, kui te pole kompileerimise ajal massiivi suuruses kindel, peaksite defineerima piisav alt suure massiivi, et olla turvalises pooles. Kuid enamasti kasutame me tegelikult vähem elemente, kui oleme eraldanud. Seega kulub märkimisväärne hulk mälu tegelikult raisku. Teisest küljest, kui "piisav alt suur massiiv" pole tegelikult piisav alt suur, jookseb programm kokku.
Mis vahe on osutitel ja massiividel?
Osuti on andmetüüp, mis salvestab selle mälukoha aadressi, kuhu mõned andmed on salvestatud, samas kui massiivid on kõige sagedamini kasutatav andmestruktuur elementide kogumi salvestamiseks. C programmeerimiskeeles toimub massiivi indekseerimine osuti aritmeetika abil (st massiivi x i-s element oleks samaväärne (x+i)). Seetõttu võib C-s järjestikuste mälukohtade kogumile osutavate osutite komplekti pidada massiiviks. Lisaks on erinevus selles, kuidas operaatori suurus osutite ja massiividega töötab. Massiivile rakendades tagastab operaator sizeof kogu massiivi suuruse, samas kui kursorile rakendades tagastab see ainult kursori suuruse.