Desreferenciar sólo significa leer el valor de la memoria en una dirección determinada. Por lo tanto, cuando tiene un puntero a algo, a desreferencia el puntero significa leer o escribir los datos a los que apunta el puntero.
En C, el operador *
único es el operador de desreferenciación.Si x
es un puntero, entonces *x
es a lo que apunta x
. El operador único &
es el operador de dirección. Si x
es cualquier cosa, entonces &x
es la dirección en la que x
se almacena en la memoria. Los *
y &
operadores son inversas entre sí: si x
es cualquier dato, y y
es cualquier indicador, a continuación, estas ecuaciones son siempre verdaderas:
*(&x) == x
&(*y) == y
un puntero nulo es un puntero que no apunta a ninguna válida datos (pero no es el único puntero). El estándar C dice que es comportamiento indefinido para desreferenciar un puntero nulo. Esto significa que podría pasar absolutamente cualquier cosa: el programa podría fallar, podría seguir funcionando silenciosamente o podría borrar tu disco duro (aunque eso es bastante improbable).
En la mayoría de las implementaciones, obtendrá un "error de segmentación" o "infracción de acceso" si intenta hacerlo, lo que casi siempre dará lugar a que su programa sea terminado por el sistema operativo. He aquí una forma en que un puntero nulo ha podido obtener:
int *x = NULL; // x is a null pointer
int y = *x; // CRASH: dereference x, trying to read it
*x = 0; // CRASH: dereference x, trying to write it
Y sí, eliminación de referencias a un puntero nulo es casi exactamente como un NullReferenceException
en C# (o una NullPointerException
en Java), excepto que el estándar del lenguaje se ve un poco más útil aquí. En C#, la eliminación de referencia de una referencia nula tiene un comportamiento bien definido: siempre arroja un NullReferenceException
. No hay forma de que su programa continúe funcionando silenciosamente o borre su disco duro como en C (a menos que haya un error en el tiempo de ejecución del lenguaje, pero de nuevo eso también es increíblemente improbable).
Tenga en cuenta que esto da como resultado un comportamiento indefinido. No obtiene excepciones ni nada, en C o C++. – GManNickG
Es posible que desee dejar algún código de ejemplo. Parece que las personas (incluyéndome a mí) no entienden lo que intentas preguntar. –
Sin necesidad de código (no hay ninguno) - Este es un problema conceptual que estoy teniendo, tratando de entender la terminología de "desreferenciación" y por qué debería preocuparme por ello. – Ash