Sekä osoittimet että viitteet ovat C: n ja C ++: n tehokkaimpia ominaisuuksia, joiden avulla ohjelmoijat voivat manipuloida muistiosoitetta suoraan tehokkaan muistinhallinnan varmistamiseksi.
Molemmat ovat muuttujia, joita käytetään viittaamaan epäsuorasti muihin esineisiin, ja niillä on yhteisiä piirteitä pinnalla. Vaikka heillä on paljon yhteisiä ominaisuuksia, he ovat myös erittäin monimutkaisia ymmärrettävissä.
Osoitin on muuttuja, jolla on toisen muuttujan muistiosoite, kun taas viite on kuin osoitin, jota voidaan käyttää viittaamaan epäsuorasti toiseen muuttuimeen.
Useimmat ohjelmoijat näyttävät kehittävän ymmärrystä siitä, milloin osoittimia käytetään ja milloin viitteitä käytetään, mutta he kohtaavat usein ongelmia, joiden ratkaisu vaikuttaa epäselvältä..
Joten ymmärtää paremmin filosofiaa, ymmärretään ero näiden kahden välillä.
Jokainen muuttuja on muistipaikka, joka määritetään osoitteensa kanssa ja pariksi tunnisteen kanssa, joka sisältää arvon, jota voidaan muuttaa ohjelman aikana. Yksinkertaisesti sanottuna muuttuja on symboli, joka edustaa määrää.
Osoitin on muuttuja, joka sisältää toisen muuttujan muistiosoitteen. Osoitin ei ole muuta kuin osoite ja osoitinta tallentava muuttuja kutsutaan osoittimen muuttujaksi.
Ajatuksena on käyttää tunnisteita (tai nimiä) numeeristen osoitteiden sijasta ohjelmoinnin taakan helpottamiseksi ja siten vähentää ohjelmien monimutkaisuutta. Koska nämä osoitteet viittaavat todellisiin sijainteihin tietokoneen muistissa, osoittimia voidaan käyttää muistiin tallennetun sisällön käyttämiseen ja käsittelemiseen.
Kuten mikä tahansa muuttuja tai vakio, osoittimet on ilmoitettava niiden tyypeille. Koska osoittimet sisältävät erilliseen tietotyyppiin kuuluvat muistiosoitteet, ne on ilmoitettava osoittimilla, ennen kuin voit työskennellä niiden kanssa. Osoitin-ilmoituksen yleinen muoto on:
Data_type * var-name;
Tässä ”Data_type” on osoittimen perustyyppi ja “var-name” on osoittimen muuttuja. Tähdellä (*) käytetään osoittamaan osoitinta, joka osoittaa muuttujan var-name osoittimen muuttujaksi.
int * p; // kokonaislukuosoitin
kellua * x; // kelluva osoitin
Tässä muuttuja “p” osoittaa kokonaisluvutietotyypin, joka julistetaan nimellä “int”, joka viittaa muuttujan tietotyyppiin. Samoin toisessa esimerkissä ”kellua” viittaa muuttujan “x” tietotyyppiin, joka itse asiassa on osoitettu liukulukujen muuttujan osoittimelle..
Viite on kuin osoitin, jolla on epäsuora pääsy muuttujaan. Se on kuin toisen muuttujan alias, tarkoittaen, että se on vain olemassa olevan muuttujan toinen nimi.
Sen avulla ohjelmoijat voivat luoda toisen nimen muuttujalle, jota he voivat käyttää kyseiseen muuttujaan tallennetun sisällön käsittelemiseen. Se on entiteetti, joka on alias toiselle muuttujalle ja jolla on sama osoite kuin alkuperäisellä muuttujalla. Se tukee ohitusviittausta, joka toimii funktiona muodollisina parametreina, ja kun se on määritelty viittaamaan muuttujaan, sitä ei voida asettaa uudelleen, mikä tarkoittaa, että sitä ei voida viitata toiseen muuttujaan.
Toisin kuin osoittimet, he eivät tarvitse neuvotteluoperaattoria pääsemään arvoon; itse asiassa niitä voidaan käyttää kuten normaalimuuttujia.
int i;
int & ri = i;
Tässä “ri” on kokonaislukuviite, joka alustetaan “i”: lle. Se julistaa ”ri” tyypin ”viittaus int” -objektiksi. Viite voidaan helposti sekoittaa osoittimeen, joka on itsenäinen muuttuja, jonka osoitearvoja ei voida määrittää uudelleen luomisen jälkeen.
- Molemmat tarjoavat käytännöllisesti katsoen samanlaisia ominaisuuksia käytettävyyden suhteen ja erottaminen voi olla hankalaa. Osoitin on vain muuttuja, joka tallentaa toisen muuttujan muistiosoitteen, kun taas viite on kuin alias jo olemassa olevalle muuttujalle. Se luo toisen nimen muuttujalle, jota voidaan käyttää muuttujan tallennetun sisällön muokkaamiseen.
- Osoitin on kuin mikä tahansa muu muuttuja, joka tallentaa pala dataa. Toisin kuin muut muuttujat, osoitinmuuttujat tallentavat muistiosoitteet arvojen sijasta. Osoittimeen viitataan käyttämällä indirektio-operaattoria * päästäksesi sen osoittaman muuttujan muistipaikkaan. Viite sitä vastoin ei tarvitse mitään neuvotteluoperaattoria pääsemään arvoon.
- Toisin kuin osoittimet, jotka voidaan alustaa milloin tahansa, referenssit on osoitettava alustaessa. Osoittimiin pääsee suoraan, kun taas viitteisiin ei pääse suoraan.
- Osoittimen muuttujalla on oma sijainti muistissa, eli kun ilmoitat osoittimen, määrität sijainnin, joka on jokaiselle muistiyksikölle määritetty muistiosoite. Osoittimen muuttujalla on sama osoite, johon se tallennetaan muistiin. Viitemuuttuja puolestaan on alias toiselle muuttujalle ottaen siten viitemuuttujan osoitteen.
- NULL edustaa luettelon loppua, mikä tarkoittaa, että arvo on tuntematon ja se määrittelee, että muuttujalla ei ole kelvollista osoitetilaa. NULL-arvo voidaan osoittaa suoraan osoittimelle, mikä viittaa siihen, että se ei osoita mihinkään, kun taas NULL-arvoa ei voida antaa viitemuuttujalle.
Osoittimet ovat aina olleet C / C ++ -ohjelmoijien suosikki keskustelunaiheita, kunnes viitteet tulivat kuvaan. Viitteet ovat jonkin verran samanlaisia kuin osoittimet, mutta niillä on kohtuullinen osuus eduista ja haitoista verrattuna. Vaikka molempia voidaan käyttää yhden funktion paikallisten muuttujien muuttamiseen toisen funktion sisällä, niillä on erot. Molemmat ovat C: n ja C ++: n tehokkaita ominaisuuksia, joiden avulla voit manipuloida muistia suoraan, mutta muutamaa poikkeusta lukuun ottamatta. Osoitin pitää muuttujan muistiosoitetta, kun taas viite on vain toisen muuttujan alias.