¿Hay alguna diferencia entre los punteros y las referencias? [duplicar]

7

Las referencias y los punteros hacen lo mismo que yo sé. ¿Hay alguna diferencia entre ellos?

Si no hay diferencia, ¿por qué los llamamos referencia no puntero?

    
pregunta yfklon 18.04.2013 - 09:16

5 respuestas

18

En general, puede hacer la siguiente distinción:

Una referencia es una variable que se refiere a otra cosa y puede usarse como un alias para esa otra cosa.

Un puntero es una variable que almacena una dirección de memoria, con el fin de actuar como un alias a lo que se almacena en esa dirección.

Por lo tanto, un puntero es una referencia, pero una referencia no es necesariamente un puntero.

Los punteros son una implementación particular del concepto de referencia, y el término tiende a usarse solo para los idiomas que le dan acceso directo a la dirección de la memoria.

Las referencias se pueden implementar internamente en un lenguaje utilizando punteros o mediante algún otro mecanismo. Por ejemplo, Perl tiene referencias simbólicas , que se refieren a la variable por su nombre en lugar de la ubicación de la memoria. Es por eso que funciona un código extraño como este:

my $bar = "foo";
$$bar = "Am I foo or bar?"; #This is actually a reference to $foo!
print $foo;

Esta distinción entre referencias y punteros no es una regla difícil y rápida (C ++ es la excepción principal, ya que tiene tanto referencias como punteros, con un significado distinto para cada una), pero cubre la mayor parte del uso.

    
respondido por el user82096 18.04.2013 - 10:04
6

No hay una diferencia generalmente aceptada entre los punteros y las referencias si nos fijamos en una distribución suficientemente amplia de idiomas usando los términos. Las variantes de los mismos conceptos utilizan ambos términos (y algunos otros como el acceso) casi indistintamente, sin embargo, algunas características tienden a estar estrechamente asociadas con uno de los términos:

  • si la aritmética está disponible, nunca he visto el término referencia utilizado. (Pero el puntero no implica que la aritmética esté disponible)

  • si el objeto al que se hace referencia no se puede cambiar, nunca he visto el término puntero utilizado excepto cuando hay una propiedad constante que se puede aplicar tanto al puntero como a otras cosas. (Pero la referencia no implica que no se vuelva a unir).

respondido por el AProgrammer 18.04.2013 - 09:35
4

Los punteros y las referencias son marcadores de posición para usar objetos.

En lugar de usar el objeto en sí, puede usar un puntero o referencia para acceder y / o manipular el objeto.

Car myCar = new Car();
Car& myCarReference = myCar;

Cambiar el contenido de myCarReference cambiará el contenido de myCar.

Los punteros agregan operaciones de dirección potentes pero potencialmente peligrosas a las referencias. Por ejemplo:

Car* myCarPointer;

    // 0x12345678=the memory adress where one car 
    // object is supposed to be in memory.
myCarPointer = 0x12345678;  
myCarPointer->setColor(red);

myCarPointer+=20;  // advance 20 cars in an array

Potencialmente peligroso significa "puede asignar cualquier dirección a un puntero. El puntero puede apuntar a una ubicación donde no hay ningún objeto de automóvil.

Los lenguajes como java y c # introdujeron referencias para hacer que los programas sean más robustos en comparación con c / c ++ que solo tienen punteros

    
respondido por el k3b 18.04.2013 - 09:34
2

Estás yuxtaponiendo las cosas equivocadas. En C ++, los punteros y las referencias tienen diferentes significados, pero como no estás preguntando por C ++, sospecho que no es lo que buscas. Si es así, echa un vistazo a la respuesta de Harssh.

Lo que probablemente desee saber es la diferencia entre una referencia a un objeto y el objeto en sí. En la mayoría de los idiomas más nuevos, puede pasar un objeto por valor o por referencia.

Pasar un objeto por valor significa hacer una copia de él. Puedes modificar esa copia sin afectar el original. Sin embargo, hacer esa copia puede costar mucho acceso a la memoria.

Pasar un objeto por referencia significa pasar un identificador a ese objeto. Esto es más barato porque no necesita hacer una copia. También significa que cualquier cambio que realice afectará al original.

Los lenguajes de programación funcionales tenderán a pasarlo todo por valor porque eso evita los efectos secundarios.

    
respondido por el Steve Rowe 18.04.2013 - 09:31
1

Los punteros y las referencias son lo suficientemente diferentes (los punteros usan los operadores * ?? y - > ??, las referencias usan.), pero parecen hacer cosas similares. Tanto los punteros como las referencias le permiten referirse a otros objetos indirectamente. ¿Cómo, entonces, decides cuándo usar uno y no el otro? Primero, reconozca que no existe tal cosa como una referencia nula. Una referencia siempre debe referirse a algún objeto. Como resultado, si tiene una variable cuyo propósito es referirse a otro objeto, pero es posible que no haya un objeto al que referirse, debería hacer que la variable sea un puntero, porque entonces puede establecerlo en nulo. Por otro lado, si la variable siempre debe referirse a un objeto, es decir, si su diseño no permite la posibilidad de que la variable sea nula, probablemente debería hacer de la variable una referencia.

para más referencia enlace

    
respondido por el Harssh 18.04.2013 - 09:20