logo

Osoittimet vs viitteet C++:ssa

Edellytys: Osoittimet , Viitteet

C- ja C++-tukiosoittimet, jotka eroavat useimmista muista ohjelmointikielistä, kuten Java, Python, Ruby, Perl ja PHP, koska ne tukevat vain viittauksia. Mutta mielenkiintoista kyllä, C++ tukee osoittimien ohella myös viittauksia.



Pinnalla sekä viittaukset että osoittimet ovat hyvin samankaltaisia, koska molempia käytetään siten, että yksi muuttuja tarjoaa pääsyn toiseen. Koska molemmat tarjoavat paljon samoja ominaisuuksia, on usein epäselvää, mikä ero näiden mekanismien välillä on. Tässä artikkelissa yritän havainnollistaa osoittimien ja viitteiden välisiä eroja.

Osoittimet : Osoitin on muuttuja, joka sisältää toisen muuttujan muistiosoitteen. Osoittimeen on poistettava viittaus * operaattoria päästäkseen muistipaikkaan, johon se osoittaa.

piilotetut sovellukset tällä laitteella

Viitteet : Viitemuuttuja on alias, eli toinen nimi jo olemassa olevalle muuttujalle. Viittaus, kuten osoitin, toteutetaan myös tallentamalla objektin osoite.
Viittausta voidaan pitää vakio-osoittimena (ei pidä sekoittaa vakioarvoon osoittavaan osoittimeen!), jossa on automaattinen epäsuuntaus, eli kääntäjä käyttää * operaattori sinulle.



int i = 3;   // A pointer to variable i or 'stores the address of i' int *ptr = &i;   // A reference (or alias) for i. int &ref = i;>

Erot :

1. Alustus: Osoitin voidaan alustaa seuraavasti:

int a = 10; int *p = &a; // OR  int *p; p = &a;>

Voimme ilmoittaa ja alustaa osoittimen samassa vaiheessa tai usealla rivillä.



xdxd merkitys

2. Viittauksissa

int a = 10; int &p = a; // It is correct // but int &p; p = a; // It is incorrect as we should declare and initialize references at single step>

HUOMAUTUS: Tämä ero voi vaihdella kääntäjästä toiseen. Yllä oleva ero liittyy Turbo IDE:hen.

3. Uudelleenmääräys: Osoitin voidaan määrittää uudelleen. Tämä ominaisuus on hyödyllinen tietorakenteiden, kuten linkitetyn luettelon, puun jne., toteuttamisessa. Katso seuraava esimerkki:

int a = 5; int b = 6; int *p; p = &a; p = &b;>

4. Toisaalta viittausta ei voi määrittää uudelleen, vaan se on määritettävä alustuksen yhteydessä.

pitkä merkkijono java
int a = 5; int b = 6; int &p = a; int &p = b; // This will throw an error of 'multiple declaration is not allowed'  // However it is valid statement, int &q = p;>

5. Muistin osoite: Osoittimella on pinossa oma muistiosoitteensa ja -kokonsa, kun taas viite jakaa saman muistiosoitteen alkuperäisen muuttujan kanssa eikä vie pinossa tilaa.

int &p = a; cout << &p << endl << &a;>

6. NULL arvo: Osoittimelle voidaan määrittää NULL suoraan, kun taas viittaukselle ei voi antaa sitä. Viittauksiin liittyvät rajoitukset (ei NULL-arvoa, ei uudelleenmäärittämistä) varmistavat, että taustalla olevat toiminnot eivät joudu poikkeustilanteeseen.

7. Välitön: Sinulla voi olla osoitin osoittimeksi (tunnetaan nimellä kaksoisosoitin), joka tarjoaa lisätasoja epäsuoraan, kun taas viittaukset tarjoavat vain yhden tason epäsuoraa. Esimerkiksi,

In Pointers, int a = 10; int *p; int **q; // It is valid. p = &a; q = &p;  // Whereas in references, int &p = a; int &&q = p; // It is reference to reference, so it is an error>

8. Aritmeettiset operaatiot: Erilaisia ​​aritmeettisia operaatioita voidaan suorittaa osoittimille, kun taas viitearitmetiikkaa ei ole olemassa (voit kuitenkin suorittaa osoittimen aritmeettisen kohteen osoitteelle, johon viittaus osoittaa, kuten &obj + 5).

Viitteiden ja osoittimien välisten erojen taulukkomuotoinen muoto C++:ssa

Viitteet Osoittimet
Uudelleenmääräys Muuttujaa ei voi määrittää uudelleen viitteessä. Muuttuja voidaan määrittää uudelleen Pointersissa.
Muistin osoite Sillä on sama osoite kuin alkuperäisellä muuttujalla. Osoittimilla on oma muistiosoitteensa.
Tehdä työtä Se viittaa toiseen muuttujaan. Se tallentaa muuttujan osoitteen.
Nolla-arvo Sillä ei ole nolla-arvoa. Sille voi olla asetettu arvo tyhjäksi.
Argumentit Tähän muuttujaan viitataan menetelmällä pass by value. Osoitin toimii menetelmällä, joka tunnetaan nimellä pass by reference.

Milloin käyttää Mitä

Esitykset ovat täsmälleen samat kuin viittaukset toteutetaan sisäisesti osoittimina. Mutta silti voit pitää mielessäsi joitain kohtia päättääksesi, milloin käytät mitä:

  • Käytä viitteitä:
    • Toimintoparametreissa ja palautustyypeissä.
  • Käytä viitteitä:
    • Jos osoittimen aritmetiikkaa tai NULL-osoittimen ohittamista tarvitaan. Esimerkiksi taulukoille (Huomaa, että taulukkoon pääsy on toteutettu osoitinaritmetiikkaa käyttämällä).
    • Toteuttaa tietorakenteita, kuten linkitetty lista, puu jne. ja niiden algoritmeja. Tämä johtuu siitä, että osoittaaksemme eri soluihin meidän on käytettävä osoittimien käsitettä.

Lainattu C++ FAQ Lite -ohjelmassa : Käytä viittauksia, kun voit, ja viitteitä, kun sinun on. Viitteet ovat yleensä etusijalla osoittimien sijaan aina, kun sinun ei tarvitse asettaa uudelleen. Tämä tarkoittaa yleensä sitä, että viittaukset ovat hyödyllisimpiä luokan julkisessa käyttöliittymässä. Viittaukset näkyvät yleensä kohteen iholla ja osoittimet sisäpuolella.

Poikkeuksena yllä olevaan on tilanne, jossa funktion parametri tai palautusarvo tarvitsee sentinel-viittauksen – viittauksen, joka ei viittaa objektiin. Tämä on yleensä parasta tehdä palauttamalla/ottamalla osoitin ja antamalla nullptr-arvolle tämä erityinen merkitys (viittausten tulee aina olla aliaksia objekteja, ei nolla-osoittimia).

java merkkijonomenetelmät

Aiheeseen liittyvä artikkeli:
Milloin välitetään argumentit viitteinä tai osoittimina?