Pointer vs array
Osuti on andmetüüp, mis sisaldab viidet mäluasukohale (s.o osutimuutuja salvestab selle mäluasukoha aadressi, kuhu osa andmeid on salvestatud). Elemendid kogude salvestamiseks on kõige sagedamini kasutatavad andmestruktuurid massiivid. Enamik programmeerimiskeeli pakub meetodeid massiivide ja massiivides olevate elementide hõlpsaks deklareerimiseks.
Mis on osuti?
Osuti on andmetüüp, mis salvestab selle mälukoha aadressi, kuhu on salvestatud mõned andmed. Teisisõnu, osuti sisaldab viidet mälu asukohale. Juurdepääsu osuti osutatavale mälupesale salvestatud andmetele nimetatakse deferenssideks. Korduvate toimingute tegemisel, näiteks puude / keelpillide sirvimine, lauaotsingud jne, parandaks osutite kasutamine jõudlust. Selle põhjuseks on asjaolu, et osutite äravõtmine ja kopeerimine on odavam kui osuti osutatud andmete kopeerimine ja neile juurdepääs. Nullkursor on osuti, mis ei osuta millelegi. Jaavas genereerib nullkursorile juurdepääs erandi, mida nimetatakse NullPointerException.
Mis on massiiv?
Joonisel 1 on kooditükk, mida tavaliselt kasutatakse massiivi väärtuste deklareerimiseks ja määramiseks. Joonis 2 kujutab massiivi väljanägemist mälus.
int väärtused [5]; väärtused [0] = 100; väärtused [1] = 101; väärtused [2] = 102; väärtused [3] = 103; väärtused [4] = 104; |
Joonis 1: Massiivile väärtuste deklareerimise ja määramise kood
100 | 101 | 102 | 103 | 104 |
Indeks: 0 | 1 | 2 | 3 | 4 |
Joonis 2: Mällu salvestatud massiiv
Eespool olev kood määratleb massiivi, mis mahutab 5 täisarvu ja millele pääseb juurde indeksite 0 kuni 4. Massiivi üheks oluliseks omaduseks on see, et kogu massiiv eraldatakse ühe mäluplokkina ja iga element saab massiivis oma ruumi . Kui massiiv on määratletud, fikseeritakse selle suurus. Nii et kui te pole kompileerimise ajal massiivi suuruses kindel, peaksite määratlema piisavalt suure massiivi, et see oleks turvalises pooles. Kuid enamasti hakkame tegelikult kasutama vähem elemente, kui oleme eraldanud. Nii kulub tegelikult märkimisväärselt palju mälu. Teisest küljest, kui “piisavalt suur massiiv” pole tegelikult piisavalt suur, siis programm jookseb kokku.
Mis vahe on osutid ja massiivid??
Osuti on andmetüüp, mis salvestab selle mälukoha aadressi, kus osa andmeid on salvestatud, samas kui massiivid on elementide kogumi salvestamiseks kõige sagedamini kasutatavad massiivid. C programmeerimiskeeles toimub massiivi indekseerimine osuti aritmeetika abil (st massiivi x-nda elemendiga võrduks * (x + i)). Seetõttu võib C-s massiivina mõelda osutite kogumit, mis osutavad järjestikustele mälupesadele. Lisaks on erinevus operaatori suuruse osutamisel osutitele ja massiividele. Massiivile rakendamisel tagastab operaator suurus massiivi kogu suuruse, osutile rakendamisel tagastab see vaid kursori suuruse..