logo

Kazalci proti referencam v C++

Predpogoj: Kazalci , Reference

C in C++ podpirata kazalce, kar se razlikuje od večine drugih programskih jezikov, kot so Java, Python, Ruby, Perl in PHP, saj podpirajo samo reference. Zanimivo pa je, da C++ skupaj s kazalci podpira tudi reference.



Na prvi pogled so si reference in kazalci zelo podobni, saj se oba uporabljata, da ena spremenljivka omogoča dostop do druge. Ker oba zagotavljata veliko enakih zmogljivosti, pogosto ni jasno, kaj se med tema mehanizmom razlikujeta. V tem članku bom poskušal ponazoriti razlike med kazalci in referencami.

Kazalci : Kazalec je spremenljivka, ki vsebuje pomnilniški naslov druge spremenljivke. Kazalec je treba dereferencirati z * operaterju za dostop do pomnilniške lokacije, na katero kaže.

vrsta vstavljanja

Reference : Referenčna spremenljivka je vzdevek, to je drugo ime za že obstoječo spremenljivko. Referenca je, tako kot kazalec, implementirana tudi s shranjevanjem naslova objekta.
Referenco si lahko predstavljamo kot stalni kazalec (ne zamenjujte ga s kazalcem na konstantno vrednost!) s samodejno posrednostjo, tj. prevajalnik bo uporabil * operater za vas.



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;>

razlike :

1. Inicializacija: Kazalec je mogoče inicializirati na ta način:

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

Kazalec lahko deklariramo in inicializiramo v istem koraku ali v več vrsticah.



namestite maven

2. Medtem ko je v referencah,

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>

OPOMBA: Ta razlika se lahko razlikuje od prevajalnika do prevajalnika. Zgornja razlika se nanaša na Turbo IDE.

3. Prerazporeditev: Kazalec je mogoče ponovno dodeliti. Ta lastnost je uporabna za implementacijo podatkovnih struktur, kot so povezani seznami, drevesa itd. Oglejte si naslednji primer:

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

4. Po drugi strani pa reference ni mogoče ponovno dodeliti in jo je treba dodeliti ob inicializaciji.

delna odvisnost
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. Naslov pomnilnika: Kazalec ima svoj pomnilniški naslov in velikost v skladu, medtem ko si referenca deli isti pomnilniški naslov z izvirno spremenljivko in ne zavzame prostora v skladu.

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

6. NULL vrednost: Kazalcu je mogoče neposredno dodeliti NULL, sklicu pa ne. Omejitve, povezane s sklici (brez NULL, brez ponovne dodelitve), zagotavljajo, da osnovne operacije ne naletijo na izjemno situacijo.

7. posrednost: Lahko imate kazalec na kazalec (znan kot dvojni kazalec), ki ponuja dodatne ravni posrednosti, medtem ko reference ponujajo samo eno raven posrednosti. na primer

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. Aritmetične operacije: Na kazalcih je mogoče izvajati različne aritmetične operacije, medtem ko ne obstaja takšna stvar, imenovana referenčna aritmetika (lahko pa izvajate aritmetiko kazalca na naslovu predmeta, na katerega kaže sklic, kot v &obj + 5).

Tabelarična oblika razlike med referencami in kazalci v C++

Reference Kazalci
Prerazporeditev Spremenljivke ni mogoče ponovno dodeliti v Reference. Spremenljivko je mogoče znova dodeliti v kazalcih.
Naslov pomnilnika Ima isti naslov kot izvirna spremenljivka. Kazalci imajo svoj pomnilniški naslov.
delo Nanaša se na drugo spremenljivko. Shranjuje naslov spremenljivke.
Nična vrednost Nima ničelne vrednosti. Lahko ima vrednost, dodeljeno kot nič.
Argumenti Na to spremenljivko se sklicuje metoda prenosa po vrednosti. Kazalec deluje z metodo, znano kot prenos po sklicu.

Kdaj uporabiti Kaj

Zmogljivosti so popolnoma enake, saj so reference implementirane interno kot kazalci. Kljub temu si lahko zapomnite nekaj točk, da se odločite, kdaj kaj uporabiti:

  • Uporabite reference:
    • V funkcijskih parametrih in vrnjenih vrstah.
  • Uporabite kazalce:
    • Če je potrebna aritmetika kazalca ali posredovanje kazalca NULL. Na primer za polja (upoštevajte, da je dostop do polja izveden z aritmetiko kazalca).
    • Za implementacijo podatkovnih struktur, kot so povezani seznami, drevesa itd., in njihovih algoritmov. To je zato, ker moramo za kazanje na različne celice uporabiti koncept kazalcev.

Citirano v C++ FAQ Lite : Uporabite reference, ko lahko, in kazalce, ko morate. Reference imajo običajno prednost pred kazalci, kadar koli ne potrebujete ponovne postavitve. To običajno pomeni, da so reference najbolj uporabne v javnem vmesniku razreda. Reference se običajno pojavijo na koži predmeta, kazalci pa na notranji strani.

Izjema od zgoraj navedenega je, če parameter ali vrnjena vrednost funkcije potrebuje referenčno sklicevanje – sklicevanje, ki se ne nanaša na predmet. To običajno najbolje storite tako, da vrnete/prevzamete kazalec in date vrednosti nullptr ta poseben pomen (sklici morajo vedno predstavljati vzdevke za objekte, ne dereferenciranega ničelnega kazalca).

če po povzetku Rudyarda Kiplinga

Sorodni članek:
Kdaj posredujemo argumente kot reference ali kazalce?