logo

Punters vs referències en C++

Requisit previ: Apuntadors , Referències

C i C++ admeten punters, que és diferent de la majoria dels altres llenguatges de programació com Java, Python, Ruby, Perl i PHP, ja que només admeten referències. Però, curiosament, C++, juntament amb els punters, també admet referències.



A la superfície, tant les referències com els punters són molt semblants, ja que tots dos s'utilitzen perquè una variable proporcioni accés a una altra. Amb tots dos oferint moltes de les mateixes capacitats, sovint no està clar què és diferent entre aquests mecanismes. En aquest article, intentaré il·lustrar les diferències entre punters i referències.

Apuntadors : Un punter és una variable que conté l'adreça de memòria d'una altra variable. S'ha de desreferenciar un punter amb el * operador per accedir a la ubicació de memòria a la qual apunta.

string.replaceall java

Referències : Una variable de referència és un àlies, és a dir, un altre nom per a una variable ja existent. Una referència, com un punter, també s'implementa emmagatzemant l'adreça d'un objecte.
Una referència es pot pensar com un punter constant (que no s'ha de confondre amb un punter a un valor constant!) amb una indirecta automàtica, és a dir, el compilador aplicarà el * operador per a vostè.



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

Diferències :

1. Inicialització: Un punter es pot inicialitzar d'aquesta manera:

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

Podem declarar i inicialitzar el punter al mateix pas o en múltiples línies.



mapes java

2. Mentre es troba a les referències,

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>

NOTA: Aquesta diferència pot variar d'un compilador a un altre. La diferència anterior és respecte a Turbo IDE.

3. Reassignació: Es pot reassignar un punter. Aquesta propietat és útil per a la implementació d'estructures de dades com una llista enllaçada, un arbre, etc. Vegeu l'exemple següent:

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

4. D'altra banda, una referència no es pot reassignar, i s'ha d'assignar a la inicialització.

font gimp
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. Adreça de memòria: Un punter té la seva pròpia adreça de memòria i mida a la pila, mentre que una referència comparteix la mateixa adreça de memòria amb la variable original i no ocupa espai a la pila.

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

6. Valor NULL: Un punter es pot assignar NULL directament, mentre que una referència no pot ser-ho. Les restriccions associades a les referències (sense NULL, sense reassignació) asseguren que les operacions subjacents no es trobin en una situació d'excepció.

7. Direcció: Podeu tenir un punter a punter (conegut com a punter doble) que ofereix nivells addicionals d'indirecció, mentre que les referències només ofereixen un nivell d'indirecció. Per exemple,

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. Operacions aritmètiques: Es poden realitzar diverses operacions aritmètiques amb els punters, mentre que no hi ha una cosa que s'anomena aritmètica de referència (no obstant això, podeu fer l'aritmètica del punter a l'adreça d'un objecte apuntat per una referència, com a &obj + 5).

Forma tabular de diferència entre referències i punters en C++

Referències Apuntadors
Reassignació La variable no es pot reassignar a Referència. La variable es pot reassignar a Pointers.
Adreça de memòria Comparteix la mateixa adreça que la variable original. Els punters tenen la seva pròpia adreça de memòria.
Treballar Es refereix a una altra variable. Emmagatzema l'adreça de la variable.
Valor nul No té valor nul. Pot tenir un valor assignat com a nul.
Arguments Aquesta variable es fa referència pel mètode pass by value. El punter fa que funcioni pel mètode conegut com a pas per referència.

Quan utilitzar Què

Les actuacions són exactament les mateixes que les referències s'implementen internament com a punters. Tot i així, podeu tenir alguns punts en la vostra ment per decidir quan utilitzar què:

  • Utilitzeu referències:
    • En paràmetres de funció i tipus de retorn.
  • Utilitzeu punters:
    • Si cal fer aritmètica del punter o passar un punter NULL. Per exemple, per a matrius (tingueu en compte que l'accés a una matriu s'implementa mitjançant l'aritmètica de punters).
    • Implementar estructures de dades com una llista enllaçada, un arbre, etc. i els seus algorismes. Això és així perquè, per apuntar a diferents cel·les, hem d'utilitzar el concepte de punters.

Citat a C++ FAQ Lite : Utilitzeu referències quan pugueu i punters quan calgui. Les referències solen ser preferides per sobre dels punters sempre que no necessiteu tornar a seure. Això normalment significa que les referències són més útils a la interfície pública d'una classe. Les referències solen aparèixer a la pell d'un objecte i els punters a l'interior.

L'excepció a l'anterior és quan el paràmetre o el valor de retorn d'una funció necessita una referència sentinella, una referència que no es refereix a un objecte. Això normalment es fa millor tornant/agafant un punter i donant al valor nullptr aquest significat especial (les referències sempre han d'anomenar objectes, no un punter nul sense referència).

generador de valors aleatoris en java

Article relacionat:
Quan passem arguments com a referència o punters?