Forudsætning: Pointer , Referencer
C og C++ understøtter pointere, hvilket er anderledes end de fleste andre programmeringssprog såsom Java, Python, Ruby, Perl og PHP, da de kun understøtter referencer. Men interessant nok understøtter C++ sammen med pointere også referencer.
På overfladen er både referencer og pointere meget ens, da begge bruges til at få en variabel til at give adgang til en anden. Da begge giver mange af de samme muligheder, er det ofte uklart, hvad der er forskelligt mellem disse mekanismer. I denne artikel vil jeg forsøge at illustrere forskellene mellem pointers og referencer.
Pointer : En pointer er en variabel, der indeholder hukommelsesadressen for en anden variabel. En pointer skal dereferences med * operatør for at få adgang til den hukommelsesplacering, den peger på.
Referencer : En referencevariabel er et alias, det vil sige et andet navn for en allerede eksisterende variabel. En reference, ligesom en pointer, implementeres også ved at gemme adressen på et objekt.
En reference kan opfattes som en konstant pointer (ikke at forveksle med en pointer til en konstant værdi!) med automatisk indirektion, dvs. compileren vil anvende * operatør for dig.
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;>
Forskelle :
1. Initialisering: En pointer kan initialiseres på denne måde:
int a = 10; int *p = &a; // OR int *p; p = &a;>
Vi kan erklære og initialisere pointer i samme trin eller i flere linjer.
2. I referencer,
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>
BEMÆRK: Denne forskel kan variere fra compiler til compiler. Ovenstående forskel er med hensyn til Turbo IDE.
3. Omfordeling: En pointer kan gentildeles. Denne egenskab er nyttig til implementering af datastrukturer som en linket liste, et træ osv. Se følgende eksempel:
int a = 5; int b = 6; int *p; p = &a; p = &b;>
4. På den anden side kan en reference ikke gentildeles og skal 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. Hukommelsesadresse: En pointer har sin egen hukommelsesadresse og størrelse på stakken, hvorimod en reference deler den samme hukommelsesadresse med den oprindelige variabel og ikke fylder i stakken.
int &p = a; cout << &p << endl << &a;>
6. NULL værdi: En pointer kan tildeles NULL direkte, hvorimod en reference ikke kan være det. Begrænsningerne forbundet med referencer (ingen NULL, ingen omfordeling) sikrer, at de underliggende operationer ikke løber ind i en undtagelsessituation.
7. Indirektion: Du kan have en pointer to pointer (kendt som en dobbelt pointer), der tilbyder ekstra niveauer af indirektion, hvorimod referencer kun tilbyder et niveau af indirekte. 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 operationer: Forskellige aritmetiske operationer kan udføres på pointere, hvorimod der ikke er noget, der hedder Reference Aritmetic (du kan dog udføre pointer-aritmetik på adressen på et objekt, der peges på af en reference, som i &obj + 5).
Tabelform for forskel mellem referencer og pointere i C++
| Referencer | Pointer | |
|---|---|---|
| Omplacering | Variablen kan ikke gentildeles i Reference. | Variablen kan omtildeles i Pointers. |
| Hukommelsesadresse | Den deler samme adresse som den oprindelige variabel. | Pointere har deres egen hukommelsesadresse. |
| Arbejde | Det refererer til en anden variabel. | Den gemmer variablens adresse. |
| Nul værdi | Den har ikke nulværdi. | Den kan have værdi tildelt som null. |
| Argumenter | Denne variabel refereres til af metoden pass by value. | Markøren fungerer ved metoden kendt som pass by reference. |
Hvornår skal du bruge Hvad
Præstationerne er nøjagtig de samme, da referencer implementeres internt som pointer. Men du kan stadig huske nogle punkter for at beslutte, hvornår du skal bruge hvad:
- Brug referencer:
- I funktionsparametre og returtyper.
- Brug pointer:
- Hvis pointer-aritmetik eller beståelse af en NULL-markør er nødvendig. For eksempel for arrays (Bemærk, at adgang til et array er implementeret ved hjælp af pointer-aritmetik).
- At implementere datastrukturer som en sammenkædet liste, et træ osv. og deres algoritmer. Dette skyldes, at vi, for at pege på forskellige celler, er nødt til at bruge begrebet pointere.
Citeret i C++ FAQ Lite : Brug referencer, når du kan, og pointer, når du skal. Referencer foretrækkes normalt frem for pointere, når du ikke har brug for genanbringelse. Dette betyder normalt, at referencer er mest nyttige i en klasses offentlige grænseflade. Referencer vises typisk på huden af et objekt og pegepinde på indersiden.
Undtagelsen fra ovenstående er, hvor en funktions parameter eller returværdi har brug for en sentinel-reference - en reference, der ikke refererer til et objekt. Dette gøres normalt bedst ved at returnere/tage en pointer, og give nullptr-værdien denne særlige betydning (referencer skal altid alias objekter, ikke en dereferenced null pointer).
Relateret artikel:
Hvornår sender vi argumenter som reference eller pointere?
det smukkeste smil i verden