Requisito previo: Consejos , Referencias
C y C++ admiten punteros, lo que se diferencia de la mayoría de los otros 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.
A primera vista, 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 ofrecen 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.
Consejos : 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.
dhl significa qué
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 (¡no debe confundirse con un puntero a un valor constante!) con dirección indirecta automática, es decir, el compilador aplicará el * operador para 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.
Java convierte un entero en una cadena
2. Mientras esté en 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 vinculada, un árbol, etc. Consulte 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.
java
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 y no ocupa espacio en la pila.
int &p = a; cout << &p << endl << &a;>
6. Valor nulo: 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) garantizan 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 aritmeticas: Se pueden realizar varias operaciones aritméticas con punteros, mientras que no existe algo llamado aritmética de referencia (sin embargo, puede realizar aritmética de punteros con la dirección de un objeto señalado por una referencia, como en &obj + 5).
Forma tabular de diferencia entre referencias y punteros en C++
| Referencias | Consejos | |
|---|---|---|
| Reasignación | La variable no se puede reasignar en Referencia. | La variable se puede reasignar en Punteros. |
| Dirección de memoria | Comparte la misma dirección que la variable original. | Los punteros tienen su propia dirección de memoria. |
| Trabajar | Se refiere a otra variable. | Está almacenando la dirección de la variable. |
| Valor nulo | No tiene valor nulo. | Puede tener un valor asignado como nulo. |
| Argumentos | Esta variable está referenciada por el método pasar por valor. | El puntero funciona mediante el método conocido como paso por referencia. |
¿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é:
- Utilice referencias:
- En parámetros de función y tipos de retorno.
- Utilice punteros:
- Si se necesita aritmética de punteros o pasar un puntero NULL. Por ejemplo, para matrices (tenga en cuenta que el acceso a una matriz 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 poder apuntar a diferentes celdas, tenemos que utilizar el concepto de punteros.
Citado en C++ Preguntas frecuentes Lite : Utilice referencias cuando pueda y sugerencias cuando sea necesario. Por lo general, se prefieren las referencias a los punteros cuando no es necesario volver a colocarlos. Esto normalmente significa que las referencias son más útiles en la interfaz pública de una clase. Las referencias suelen aparecer en la superficie de un objeto y los punteros en el interior.
La excepción a lo anterior es cuando el parámetro o valor de retorno de una función necesita una referencia centinela, una referencia que no hace referencia 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 alias objetos, no un puntero nulo sin referencia).
jsp
Artículo relacionado:
¿Cuándo pasamos argumentos como referencia o punteros?