Forutsetning: Pekere , Referanser
C og C++ støtter pekere, som er forskjellig fra de fleste andre programmeringsspråk som Java, Python, Ruby, Perl og PHP da de kun støtter referanser. Men interessant nok støtter C++, sammen med pekere, også referanser.
På overflaten er både referanser og pekere veldig like ettersom begge brukes til å ha en variabel som gir tilgang til en annen. Siden begge gir mange av de samme egenskapene, er det ofte uklart hva som er forskjellig mellom disse mekanismene. I denne artikkelen vil jeg prøve å illustrere forskjellene mellom pekere og referanser.
Pekere : En peker er en variabel som inneholder minneadressen til en annen variabel. En peker må derefereres med * operatør for å få tilgang til minneplasseringen den peker på.
Referanser : En referansevariabel er et alias, det vil si et annet navn for en allerede eksisterende variabel. En referanse, som en peker, implementeres også ved å lagre adressen til et objekt.
En referanse kan betraktes som en konstant peker (ikke å forveksle med en peker til en konstant verdi!) med automatisk indirektion, dvs. kompilatoren vil bruke * operatør for deg.
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;>
Forskjeller :
1. Initialisering: En peker kan initialiseres på denne måten:
int a = 10; int *p = &a; // OR int *p; p = &a;>
Vi kan deklarere og initialisere pekeren i samme trinn eller på flere linjer.
2. Mens du er i referanser,
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>
MERK: Denne forskjellen kan variere fra kompilator til kompilator. Forskjellen ovenfor er med hensyn til Turbo IDE.
3. Omfordeling: En peker kan tilordnes på nytt. Denne egenskapen er nyttig for implementering av datastrukturer som en koblet liste, et tre osv. Se følgende eksempel:
int a = 5; int b = 6; int *p; p = &a; p = &b;>
4. På den annen side kan en referanse ikke tilordnes på nytt, og må tildeles ved initialisering.
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. Minneadresse: En peker har sin egen minneadresse og størrelse på stabelen, mens en referanse deler den samme minneadressen med den opprinnelige variabelen og tar ingen plass på stabelen.
int &p = a; cout << &p << endl << &a;>
6. NULL-verdi: En peker kan tildeles NULL direkte, mens en referanse ikke kan være det. Begrensningene knyttet til referanser (ingen NULL, ingen omfordeling) sikrer at de underliggende operasjonene ikke kommer inn i en unntakssituasjon.
7. Indirektion: Du kan ha en peker til peker (kjent som en dobbel peker) som tilbyr ekstra nivåer av indirektion, mens referanser bare tilbyr ett nivå av indirektion. For eksempel,
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. Aritmetiske operasjoner: Ulike aritmetiske operasjoner kan utføres på pekere, mens det ikke finnes noe som heter Reference Aritmetic (du kan imidlertid utføre pekereritmetikk på adressen til et objekt pekt på av en referanse, som i &obj + 5).
Tabellform for forskjellen mellom referanser og pekere i C++
| Referanser | Pekere | |
|---|---|---|
| Omplassering | Variabelen kan ikke tilordnes på nytt i Reference. | Variabelen kan tilordnes på nytt i Pointers. |
| Minneadresse | Den deler samme adresse som den opprinnelige variabelen. | Pekere har sin egen minneadresse. |
| Arbeid | Det refererer til en annen variabel. | Den lagrer adressen til variabelen. |
| Null verdi | Den har ikke nullverdi. | Den kan ha verdi tilordnet som null. |
| Argumenter | Denne variabelen refereres til av metoden pass by value. | Pekeren fungerer etter metoden kjent som pass by reference. |
Når du skal bruke Hva
Forestillingene er nøyaktig de samme da referanser implementeres internt som pekepinner. Men likevel kan du ha noen punkter i tankene dine for å bestemme når du skal bruke hva:
- Bruk referanser:
- I funksjonsparametere og returtyper.
- Bruk pekere:
- Hvis pekeraritmetikk eller bestått en NULL-peker er nødvendig. For eksempel for matriser (Merk at tilgang til en matrise implementeres ved bruk av pekeraritmetikk).
- For å implementere datastrukturer som en koblet liste, et tre osv. og deres algoritmer. Dette er fordi, for å peke på forskjellige celler, må vi bruke begrepet pekere.
Sitert i C++ FAQ Lite : Bruk referanser når du kan, og pekere når du må. Referanser foretrekkes vanligvis fremfor pekere når du ikke trenger å sette på nytt. Dette betyr vanligvis at referanser er mest nyttige i en klasses offentlige grensesnitt. Referanser vises vanligvis på huden til et objekt, og pekere på innsiden.
Unntaket fra ovenstående er der en funksjons parameter eller returverdi trenger en vaktreferanse - en referanse som ikke refererer til et objekt. Dette gjøres vanligvis best ved å returnere/ta en peker, og gi nullptr-verdien denne spesielle betydningen (referanser må alltid alias objekter, ikke en dereferert null-peker).
Relatert artikkel:
Når sender vi argumenter som referanse eller pekere?
det vakreste smilet i verden