Supongamos que las direcciones de memoria se representan
internamente con 32 bits (4 bytes). Entonces, podemos almacenar la dirección
de d1
(el número 100) en otro lugar en memoria que ocupará 4
bytes por ser una dirección de memoria. La siguiente figura muestra esta
situación con la dirección de memoria almacenada en la posición 200.
En C se obtiene la dirección de memoria de cualquier
variable mediante el operando &
seguido del nombre de la
variable. En la figura anterior, la expresión &d1
devuelve
el valor 100.
El valor que devuelve el operador &
depende
de la posición de memoria de su operando, y por tanto, no está bajo el
control del programador. A la dirección de memoria almacenada como dato en
la posición 200 se le denomina “puntero” pues su valor
“apunta” a donde se encuentra la variable d1
. Otra
forma de enunciarlo: en la posición 200 hay un puntero a
d1
.
Si en la posición 200 está almacenado un puntero a la
variable d1
se pueden acceder a los datos de esta estructura
mediante una “indirección”. Se toma el dato almacenado en la
posición 200 y su valor (el número 100) se interpreta ahora como una
dirección. Se accede a esa dirección y de ahí se accede a los campos de
d1
. Acabamos de acceder a d1
de forma indirecta, o
a través de una “indirección”.
La indirección se puede aplicar múltiples veces en un mismo
acceso en lo que se conoce como “indirección
múltiple”. Siguiendo con el ejemplo anterior, podemos almacenar ahora
la dirección del puntero (esto es, el valor 200) en otra posición de
memoria, por ejemplo, la posición 300. En esta posición 300 tenemos la
dirección de la dirección de d1
. O de forma análoga, en la
posición 300 hay un puntero a un puntero a d1
. Igualmente, se
puede acceder a los datos de d1
pero esta vez mediante una
doble indirección. Se pueden construir indirecciones múltiples con un número
arbitrario de niveles.