2009-12-23 14 views
42

¿Hay alguna forma de encontrar la dirección de una referencia?¿Hay alguna forma de encontrar la dirección de una referencia?

Lo que lo hace más específico: la dirección de la variable en sí y no la dirección de la variable con la que se inicializa.

+0

Makingit más específico: La dirección de la variable en sí y no la dirección de la variable con la que se inicializa. – Sandeep

+4

@Mahesh, dale un poco de holgura. Él ni siquiera ha sido miembro por dos semanas. Tal vez él no sabe cómo aceptar una respuesta. –

+0

Relacionados: http://stackoverflow.com/questions/1898524/difference-between-pointer-to-a-reference-and-reference-to-a-pointer/1898556#1898556 – AraK

Respuesta

39

Las referencias no tienen sus propias direcciones. Aunque las referencias pueden implementarse como punteros, no hay necesidad o garantía de esto.

The C++ FAQ dice mejor:

A diferencia de un puntero, una vez que una referencia es unido a un objeto, no se puede "volver a colocar" a otro objeto. La referencia en sí misma no es un objeto ( no tiene identidad; tomando la dirección una referencia le da la dirección de el referente; recuerde: la referencia es su referente).

También vea mi respuesta aquí para un comprehensive list of how references differ from pointers.

La referencia es su referente

+7

Estás en lo correcto. Pero a veces es más fácil usar el término alias en lugar de referencia. –

+1

¿Hay alguna implementación de ejemplo de referencia como punteros? estoy realmente interesado en ver cómo se implementaron. Por favor, comparta cualquier ejemplo si se encontró. – Hemanth

+1

@Saran: GCC es de código abierto. –

7

Simplemente use el operador '&'. por ejemplo:

int x = 3; 
int &y = x; 
cout<<&y<<endl; 

Esto devolverá la dirección de X ya que Y es nada más que la dirección de x.

+2

Creo que Sandeep es la * dirección de la referencia en sí * –

+0

que efectivamente imprimirá la dirección de x (ya que y es una referencia es solo otro nombre para x). –

+0

Sí, en realidad no estaba seguro de si se refería a la dirección a la que hace referencia o a la referencia en sí, así que publiqué esta respuesta por si acaso. Pero, ¿no es la referencia nada más que la dirección de lo que apunta? ¿Entonces la dirección de la referencia sería la dirección de "x" en mi ejemplo? Sólo me pregunto. :) –

3

No es fiable, ya que las referencias no tienen que tener una ubicación única en la memoria direccionable.

10

Como dice Bjarne Stroustrup en el TC++ PL, una referencia puede ser pensado como sólo otro nombre para una entidad (objeto o función) existente . Si bien esta no es siempre la descripción más precisa del mecanismo subyacente de bajo nivel que implementa referencias, es una descripción muy buena del concepto que las referencias pretenden implementar a nivel de lenguaje. No es sorprendente que el lenguaje no proporcione los medios para obtener la dirección de referencia en sí misma.

En el nivel de idioma, no se garantiza que la referencia ocupe un lugar en el almacenamiento y, por lo tanto, en general no tiene dirección.

15

La norma ISO dice mejor:

No habrá referencias a referencias, no hay matrices de referencias, y no hay punteros a referencias.

no me gusta la lógica de una gran cantidad de gente está utilizando aquí, que no puede hacerlo porque la referencia no es "la garantía de ser simplemente un puntero en algún lugar de todos modos." Así como int x puede ser solo un registro de procesador sin dirección, pero mágicamente se convierte en una ubicación de memoria cuando se usa & x, aún puede ser posible que el compilador permita lo que desee.

En el pasado, muchos compiladores lo permitió exactamente lo que estás pidiendo, por ejemplo

int x, y; 
int &r = x; 
&r = &y; // use address as an lvalue; assign a new referent 

acabo de comprobar y GCC a compilarlo, pero con una advertencia enérgica, y el programa resultante es roto .

+1

+1 Para citar el estándar. – GManNickG

2

No solo. Si desea su "dirección", empújela en una estructura o clase. Incluso entonces, no necesariamente se garantiza que te acercará a lo que probablemente quieras hacer, que es usar un puntero. Si desea una prueba, el tamaño de una referencia es igual al tipo de referencia. Pruébalo con el número & y mira.

28

NO. No hay forma de obtener la dirección de una referencia.
Esto se debe a que una referencia no es un objeto, es un alias (esto significa que es otro nombre para un objeto).

int x = 5; 
int& y = x; 

std::cout << &x << " : " << &y << "\n"; 

Esto imprimirá la misma dirección.
Esto se debe a que 'y' es solo otro nombre (un alias) para el objeto 'x'.

8

De otra instancia de esta misma pregunta: $ 8.3.2/3 - "No se especifica si una referencia requiere almacenamiento (3.7) o no".

Por lo tanto, el estándar de C++ permite al compilador/implementador de tiempo de ejecución elegir si una referencia vive o no en una ubicación de memoria separada. Sin embargo, tenga en cuenta que si vive en una ubicación de memoria separada, no podrá encontrar su dirección de manera estándar. Entonces no lo hagas

Si toma una dirección de una referencia, por definición en el estándar C++, obtendrá la dirección a la que hace referencia, en lugar de la dirección de la referencia, si de hecho esa referencia existe incluso como una entidad separada en el entorno de tiempo de ejecución o no.

1

Es posible, pero no estrictamente el uso de C++. Como la referencia se pasa como un parámetro de una función, su valor se almacenará en la pila o en un registro. Esto depende de la arquitectura del hardware. El acceso a estos valores requerirá un ensamblaje en línea. Consulte el manual de referencia del procesador que está utilizando para determinar el comportamiento de la pila y las direcciones de registro. Corromper la pila o los registros pueden causar fácilmente BSOD, pérdida de datos o incluso daños permanentes en su sistema. Proceda con extrema precaución.

Cuestiones relacionadas