Osoitin ja viite

Anonim

Molemmat osoittimet ja viitteet ovat C: n ja C ++: n tehokkaimpia ominaisuuksia, joiden avulla ohjelmoijat voivat muokata muistin osoitetta suoraan tehokasta muistihallintaa varten.

Molemmat ovat muuttujia, joita käytetään viittaamaan muihin kohteisiin epäsuorasti ja niillä on yhteisiä piirteitä pinnalla. Vaikka heillä on paljon yhteisiä valmiuksia, he ovat myös hyvin monimutkaisia ​​ymmärtämään.

Osoitin on muuttuja, joka pitää toisen muuttujan muistiosoitteen, kun taas viite on kuin osoitin, jota voidaan käyttää välillisesti viittaamaan toiseen muuttujaan.

Useimmat ohjelmoijat näyttävät kehittävän jonkinlaisen käsityksen siitä, milloin käyttää viitteitä ja milloin käyttää viittauksia, mutta he usein kohtaavat ongelmia, joiden ratkaisu tuntuu epäselvältä.

Jotta ymmärtää filosofiaa paremmin, ymmärrämme näiden kahden välisen eron.

Mikä on osoitin?

Jokainen muuttuja on muistipaikka, joka määritellään sen osoitteella ja yhdistetään tunnisteen kanssa, joka sisältää jotain arvoa, jota voidaan muuttaa ohjelman aikana. Yksinkertaisella tavalla muuttuja on symboli, joka edustaa määrää.

Osoitin on muuttuja, joka sisältää toisen muuttujan muistiosoitteen. Osoitin ei ole vain osoitetta, ja muuttuja, joka tallentaa osoittimen, kutsutaan osoittimen muuttujaksi.

Ajatuksena on käyttää tunnisteita (tai nimiä) numeeristen osoitteiden sijaan ohjelmoinnin taakan helpottamiseksi, mikä vähentää ohjelmien monimutkaisuutta. Koska nämä osoitteet viittaavat tietokoneen muistissa oleviin paikkoihin, niitä voidaan käyttää muistiin tallennettujen sisältöjen käsittelemiseen ja muokkaamiseen.

Kuten minkä tahansa muuttujan tai vakion, on ilmoitettava niiden tyypeistä. Koska osoittimet sisältävät muistiosoitteita, jotka kuuluvat erilliseen tietotyyppiin, ne on julistettava osoittimien avulla, ennen kuin voit käsitellä niitä. Osoitinilmoituksen yleinen muoto on:

Data_type * var-nimi;

Tässä "Data_type" on osoittimen perustyyppi ja "var-name" on osoittimen muuttuja. Tähdellä (*) tässä käytetään osoittamaan osoitinta, joka nimeää muuttujan "var-name" osoittimen muuttujaksi.

int * p; // kokonaislukuosoitin

float * x; // float-osoitin

Tässä muuttuja "p" viittaa kokonaislukutyyppityyppiin, joka on julistettu "intiksi", joka viittaa muuttujan tietotyyppiin. Vastaavasti toisessa esimerkissä "float" viittaa muuttujan "x" tietotyyppiin, joka todellisuudessa on osoitettu osoittimena liukuvapaa-muuttujaan.

Mikä on viite?

Viittaus on kuin osoitin, jolla on välillinen pääsy muuttujaan. Se on kuin toisen muuttujan alias, eli se on vain uusi nimi jo olemassa olevalle muuttujalle.

Sen avulla ohjelmoijat voivat luoda toisen nimen muuttujalle, jota he voivat käyttää manipuloimaan kyseisessä muuttujassa tallennettua sisältöä. Se on kokonaisuus, joka on toisen muuttujan alias ja sillä on sama osoite kuin alkuperäinen muuttuja. Se tukee läpilyöntiä, joka toimii funktionaalisena muotona ja kun se on määritelty viittaamaan muuttujaan, sitä ei voida uudelleenjulkaisua, joten sitä ei voida viitata toiseen muuttujaan.

Toisin kuin osoittimet, he eivät tarvitse dereferencing-operaattoria pääsemään arvoon; itse asiassa niitä voidaan käyttää normaaleihin muuttujiin.

int i;

int & ri = i;

Tässä "ri" on kokonaislukuviite, joka on alustettu "i": ksi. Se ilmoittaa "ri" kohteen "viittauksen int" objektiksi. Viittaus voidaan helposti sekoittaa osoittimen kanssa, joka on itsenäinen muuttuja, jonka osoitetietoja ei voida jakaa uudelleen luodun kerran.

Pointerin ja referenssin ero

  1. Osoittimen ja referenssin perusteet

- Molemmat tarjoavat lähes samanlaisia ​​kykyjä käytettävyyden suhteen ja ero voi olla hankalaa. Osoitin on vain muuttuja, joka tallentaa toisen muuttujan muistiosoitteen, kun taas viittaus on kuin jo olemassa olevan muuttujan alias. Se luo toisen nimen muuttujalle, jota voidaan käyttää muuttujan sisällön muokkaamiseen.

  1. Osoitin ja viittaus

- Osoitin on kuin mikä tahansa muu muuttuja, joka tallentaa tietyn osan.Toisin kuin muut muuttujat, osoittimen muuttujat tallentavat muistiosoitteet arvojen sijaan. Osoitin dereferenoidaan indirection-operaattorin * avulla päästäkseen muuttuvan muuttujan muistipaikkaan. Viittaus ei toisaalta vaadi mitään dereferencing-operaattoria pääsemään arvoon.

  1. Osoittimen ja viitteen uudelleensijoittaminen

- Toisin kuin aloitusvihjeitä milloin tahansa, viittaukset on määritettävä alustuksen yhteydessä. Osoittimia voi käyttää suoraan, kun taas viitteitä ei voi käyttää suoraan.

  1. Osoitteen ja referenssin muistin osoite

- Osoitinmuuttujalla on oma sijainti muistiin, mikä tarkoittaa, kun ilmoitat osoittimen, määrität sijainnin, joka on muistipaikka, joka on osoitettu kullekin muistikappaleelle. Osoitinmuuttujalla on sama osoite, jossa se tallennetaan muistiin. Vertailumuuttuja, toisaalta, on toisen muuttujan alias, jolloin viitemuuttujan osoite otetaan.

  1. NULL Osoittimen ja referenssin arvo

- NULL edustaa luettelon loppua, mikä tarkoittaa sitä, että arvo on tuntematon ja määrittää, että muuttuvalla ei ole kelvollista osoiteavaruutta. NULL-arvo voidaan osoittaa suoraan osoitinmuuttujaan, mikä viittaa siihen, että se ei osoita mihinkään, kun taas NULL-arvoa ei voida määrittää vertailumuuttujalle.

Pointer vs. viite: vertailukuvio

Yhteenveto osoittimesta vs. viite

Osoittimet ovat aina olleet suosituimpia keskusteluaiheita C / C ++ -ohjelmoijista ennen kuin viittaukset tulivat kuvaan. Viitteet ovat jonkin verran samanlaisia ​​kuin osoittimet, mutta niillä on kohtuullinen osuus eduista ja haitoista vertailussa. Vaikka molempia voidaan käyttää muuttamaan yhden funktion paikalliset muuttujat toisessa funktiossa, niillä on erimielisyytensä. Molemmat ovat tehokkaita C- ja C ++-ominaisuuksia, joiden avulla voit muokata muistia suoraan, mutta muutamia poikkeuksia lukuun ottamatta. Osoittimessa on muuttujan muistiosoite, kun taas viittaus on vain toisen muuttujan alias.