pointer - significado de "referencia" y "desreferencia"
pointers in c (5)
Leí cosas diferentes en Internet y me confundí, porque cada sitio web dice cosas diferentes.
Hablando de C.
Leí acerca de *
operador de referencia y operador de desreferenciación; o que hacer referencia significa hacer que un puntero apunte a una variable y desreferenciar está accediendo al valor de la variable a la que apunta el puntero. Entonces me confundí.
¿Puedo obtener una explicación simple pero exhaustiva sobre "referenciar y eliminar referencias"?
Referenciando
&
es el operador de referencia. Referirá la dirección de memoria a la variable del puntero.
Ejemplo:
int *p;
int a=5;
p=&a; // Here Pointer variable p refers to the address of integer variable a.
Desreferencia
El operador de desreferencia *
es utilizado por la variable de puntero para acceder directamente al valor de la variable en lugar de su dirección de memoria.
Ejemplo:
int *p;
int a=5;
p=&a;
int value=*p; // Value variable will get the value of variable a that pointer variable p pointing to.
Para empezar, los tienes al revés: &
es referencia y *
es la desreferencia.
Hacer referencia a una variable significa acceder a la dirección de memoria de la variable:
int i = 5;
int * p;
p = &i; //&i returns the memory address of the variable i.
Desreferenciar una variable significa acceder a la variable almacenada en una dirección de memoria:
int i = 5;
int * p;
p = &i;
*p = 7; //*p returns the variable stored at the memory address stored in p, which is i.
//i is now 7
Siempre los he escuchado usar en el sentido opuesto:
&
es el operador de referencia - le da una referencia (puntero) a algún objeto*
es el operador de desreferencia - toma una referencia (puntero) y le devuelve el objeto referido;
encuentra la siguiente explicación:
int main()
{
int a = 10;// say address of ''a'' is 2000;
int *p = &a; //it means ''p'' is pointing[referencing] to ''a''. i.e p->2000
int c = *p; //*p means dereferncing. it will give the content of the address pointed by ''p''. in this case ''p'' is pointing to 2000[address of ''a'' variable], content of 2000 is 10. so *p will give 10.
}
conclusión:
-
&
[operador de dirección] se usa para hacer referencia. -
*
[operador de estrella] se utiliza para eliminar referencias.
Hacer referencia significa tomar la dirección de una variable existente (usando &) para establecer una variable de puntero. Para que sea válido, un puntero debe establecerse en la dirección de una variable del mismo tipo que el puntero, sin el asterisco:
int c1;
int* p1;
c1 = 5;
p1 = &c1;
//p1 references c1
Desreferenciar un puntero significa usar el operador * (carácter de asterisco) para acceder al valor almacenado en un puntero: NOTA: El valor almacenado en la dirección del puntero debe ser un valor DEL MISMO TIPO que el tipo de variable que el puntero "señala" a, pero no hay garantía de que este sea el caso a menos que el puntero se haya configurado correctamente. El tipo de variable al que apunta el puntero es el tipo menos el asterisco más externo.
int n1;
n1 = (*p1);
La desreferenciación no válida puede o no causar bloqueos:
- Cualquier desreferenciación de cualquier puntero no inicializado puede causar un bloqueo
- La desreferenciación con un molde de tipo no válido tendrá el potencial de causar un bloqueo.
- La desreferenciación de un puntero a una variable que se asignó dinámicamente y que posteriormente se desasignó puede causar un bloqueo
- Al hacer referencia a un puntero a una variable que desde entonces se ha salido del alcance también puede causar un bloqueo.
Las referencias no válidas tienen más probabilidades de causar errores de compilación que bloqueos, pero no es una buena idea confiar en el compilador para esto.
Referencias
http://www.codingunit.com/cplusplus-tutorial-pointers-reference-and-dereference-operators
& is the reference operator and can be read as “address of”.
* is the dereference operator and can be read as “value pointed by”.
http://www.cplusplus.com/doc/tutorial/pointers/
& is the reference operator
* is the dereference operator
http://en.wikipedia.org/wiki/Dereference_operator
The dereference operator * is also called the indirection operator.