Voorwaarde: Wijzers , Referenties
C en C++ ondersteunen pointers, wat anders is dan de meeste andere programmeertalen zoals Java, Python, Ruby, Perl en PHP, omdat ze alleen referenties ondersteunen. Maar interessant genoeg ondersteunt C++, naast pointers, ook referenties.
Op het eerste gezicht lijken zowel referenties als pointers erg op elkaar, omdat beide worden gebruikt om de ene variabele toegang te geven tot de andere. Omdat beide veel dezelfde mogelijkheden bieden, is het vaak onduidelijk wat het verschil is tussen deze mechanismen. In dit artikel zal ik proberen de verschillen tussen pointers en referenties te illustreren.
Wijzers : Een pointer is een variabele die het geheugenadres van een andere variabele bevat. Er moet een verwijzing naar een pointer worden verwijderd met de * operator om toegang te krijgen tot de geheugenlocatie waarnaar deze verwijst.
Referenties : Een referentievariabele is een alias, dat wil zeggen een andere naam voor een reeds bestaande variabele. Een referentie wordt, net als een pointer, ook geïmplementeerd door het adres van een object op te slaan.
Een verwijzing kan worden gezien als een constante pointer (niet te verwarren met een pointer naar een constante waarde!) met automatische indirectie, dat wil zeggen dat de compiler de * operator voor u.
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;>
Verschillen :
die school maakte
1. Initialisatie: Een pointer kan op deze manier worden geïnitialiseerd:
int a = 10; int *p = &a; // OR int *p; p = &a;>
We kunnen de aanwijzer in dezelfde stap of op meerdere regels declareren en initialiseren.
2. Terwijl je in referenties bent,
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>
OPMERKING: Dit verschil kan variëren van compiler tot compiler. Het bovenstaande verschil heeft betrekking op Turbo IDE.
3. Herplaatsing: Een pointer kan opnieuw worden toegewezen. Deze eigenschap is handig voor de implementatie van datastructuren zoals een gekoppelde lijst, een boom, enz. Zie het volgende voorbeeld:
int a = 5; int b = 6; int *p; p = &a; p = &b;>
4. Aan de andere kant kan een referentie niet opnieuw worden toegewezen en moet deze bij initialisatie worden toegewezen.
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. Geheugenadres: Een pointer heeft zijn eigen geheugenadres en -grootte op de stapel, terwijl een referentie hetzelfde geheugenadres deelt met de oorspronkelijke variabele en geen ruimte in beslag neemt op de stapel.
int &p = a; cout << &p << endl << &a;>
6. NULL-waarde: Aan een pointer kan direct NULL worden toegewezen, terwijl dat aan een referentie niet kan. De beperkingen die aan verwijzingen zijn gekoppeld (geen NULL, geen nieuwe toewijzing) zorgen ervoor dat de onderliggende bewerkingen niet in een uitzonderingssituatie terechtkomen.
vijay filmacteur
7. Indirectie: Je kunt een pointer-to-pointer hebben (ook wel een dubbele pointer genoemd) die extra indirectieniveaus biedt, terwijl verwijzingen slechts één indirectieniveau bieden. Bijvoorbeeld,
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. Rekenkundige bewerkingen: Er kunnen verschillende rekenkundige bewerkingen worden uitgevoerd op pointers, terwijl referentieberekeningen niet bestaan (u kunt echter wel pointer-berekeningen uitvoeren op het adres van een object waarnaar wordt verwezen door een referentie, zoals in &obj + 5).
Tabelvorm van het verschil tussen referenties en pointers in C++
| Referenties | Wijzers | |
|---|---|---|
| Herplaatsing | De variabele kan niet opnieuw worden toegewezen in Reference. | De variabele kan opnieuw worden toegewezen in Pointers. |
| Geheugenadres | Het deelt hetzelfde adres als de oorspronkelijke variabele. | Pointers hebben hun eigen geheugenadres. |
| Werk | Het verwijst naar een andere variabele. | Het slaat het adres van de variabele op. |
| Nulwaarde | Het heeft geen nulwaarde. | Er kan een waarde nul aan worden toegekend. |
| Argumenten | Er wordt naar deze variabele verwezen door de methode pass by value. | De aanwijzer werkt volgens de methode die bekend staat als 'pass by reference'. |
Wanneer gebruik je Wat
De prestaties zijn exact hetzelfde, aangezien referenties intern als pointers zijn geïmplementeerd. Maar toch kunt u enkele punten in gedachten houden om te beslissen wanneer u wat gaat gebruiken:
c# woordenboek
- Gebruik referenties:
- In functieparameters en retourtypen.
- Gebruik aanwijzingen:
- Als pointer-berekeningen of het doorgeven van een NULL-pointer nodig zijn. Bijvoorbeeld voor arrays (merk op dat toegang tot een array wordt geïmplementeerd met behulp van pointer-berekeningen).
- Om datastructuren zoals een gekoppelde lijst, een boom, enz. en hun algoritmen te implementeren. Dit komt omdat we, om naar verschillende cellen te kunnen verwijzen, het concept van pointers moeten gebruiken.
Geciteerd in C++ FAQ Lite : Gebruik verwijzingen wanneer dat kan, en aanwijzingen wanneer dat nodig is. Referenties hebben meestal de voorkeur boven verwijzingen wanneer u niet opnieuw hoeft te gaan zitten. Dit betekent meestal dat verwijzingen het nuttigst zijn in de openbare interface van een klasse. Referenties verschijnen doorgaans op de huid van een object en aanwijzers aan de binnenkant.
De uitzondering op het bovenstaande is waar de parameter of retourwaarde van een functie een sentinel-referentie nodig heeft: een verwijzing die niet naar een object verwijst. Dit kunt u meestal het beste doen door een pointer terug te geven/te nemen, en de nullptr-waarde deze speciale betekenis te geven (referenties moeten altijd een alias zijn van objecten, niet een nul-pointer waarvan de referentie is verwijderd).
Gerelateerd artikel:
Wanneer geven we argumenten door als referentie of pointers?