Prerrequisito: Punteros , Referencias
C y C++ admiten punteros, que es diferente de la mayoría de los demás lenguajes de programación, como Java, Python, Ruby, Perl y PHP, ya que solo admiten referencias. Pero, curiosamente, C++, junto con los punteros, también admite referencias.
En la superficie, tanto las referencias como los punteros son muy similares, ya que ambos se utilizan para que una variable proporcione acceso a otra. Dado que ambos brindan muchas de las mismas capacidades, a menudo no está claro qué es diferente entre estos mecanismos. En este artículo, intentaré ilustrar las diferencias entre punteros y referencias.
Punteros : Un puntero es una variable que contiene la dirección de memoria de otra variable. Es necesario desreferenciar un puntero con el operador * para acceder a la ubicación de memoria a la que apunta.
Referencias : Una variable de referencia es un alias, es decir, otro nombre para una variable ya existente. Una referencia, como un puntero, también se implementa almacenando la dirección de un objeto.
Una referencia puede considerarse como un puntero constante (¡que no debe confundirse con un puntero a un valor constante!) con direccionamiento indirecto automático, es decir, el compilador aplicará el operador * por usted.
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;
diferencias :
1. Inicialización: un puntero se puede inicializar de esta manera:
int a = 10; int *p = &a; // OR int *p; p = &a;
Podemos declarar e inicializar el puntero en el mismo paso o en varias líneas.
2. Mientras que en las referencias,
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: Esta diferencia puede variar de un compilador a otro. La diferencia anterior es con respecto a Turbo IDE.
3. Reasignación: se puede reasignar un puntero. Esta propiedad es útil para la implementación de estructuras de datos como una lista enlazada, un árbol, etc. Vea el siguiente ejemplo:
int a = 5; int b = 6; int *p; p = &a; p = &b;
4. Por otro lado, una referencia no se puede reasignar y debe asignarse en la inicialización.
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. Dirección de memoria: un puntero tiene su propia dirección de memoria y tamaño en la pila, mientras que una referencia comparte la misma dirección de memoria con la variable original pero también ocupa algo de espacio en la pila.
int &p = a; cout << &p << endl << &a;
6. Valor NULL: a un puntero se le puede asignar NULL directamente, mientras que a una referencia no se le puede asignar. Las restricciones asociadas con las referencias (sin NULL, sin reasignación) aseguran que las operaciones subyacentes no se encuentren en una situación de excepción.
7. Indirección: puede tener un puntero a puntero (conocido como puntero doble) que ofrece niveles adicionales de direccionamiento indirecto, mientras que las referencias solo ofrecen un nivel de direccionamiento indirecto. Por ejemplo,
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. Operaciones aritméticas: se pueden realizar varias operaciones aritméticas con punteros, mientras que no existe tal cosa llamada aritmética de referencia (sin embargo, puede realizar aritmética de punteros en la dirección de un objeto al que apunta una referencia, como en &obj + 5).
Cuándo usar Qué
Las actuaciones son exactamente las mismas ya que las referencias se implementan internamente como punteros. Pero aún así, puedes tener algunos puntos en mente para decidir cuándo usar qué:
- Usar referencias:
- En parámetros de función y tipos de devolución.
- Utilice punteros:
- Si se necesita aritmética de punteros o pasar un puntero NULL. Por ejemplo, para arrays (tenga en cuenta que el acceso a una array se implementa mediante aritmética de punteros).
- Implementar estructuras de datos como una lista enlazada, un árbol, etc. y sus algoritmos. Esto es así porque, para apuntar a diferentes celdas, tenemos que usar el concepto de punteros.
Citado en C++ FAQ Lite : use referencias cuando pueda y punteros cuando sea necesario. Por lo general, se prefieren las referencias a los punteros siempre que no necesite «volver a colocar». Esto generalmente significa que las referencias son más útiles en la interfaz pública de una clase. Las referencias suelen aparecer en la piel de un objeto y los punteros en el interior.
La excepción a lo anterior es cuando el parámetro de una función o el valor devuelto necesita una referencia «centinela», una referencia que no se refiere a un objeto. Por lo general, esto se hace mejor devolviendo/tomando un puntero y dando al valor «nullptr» este significado especial (las referencias siempre deben ser alias de objetos, no un puntero nulo sin referencia).
Artículo relacionado:
¿Cuándo pasamos argumentos como referencia o punteros?
Este artículo es una contribución de Rishav Raj . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
Publicación traducida automáticamente
Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA