UC3M

Grado en Ing. Telemática/Sist. Audiovisuales/Sist. de Comunicaciones

Arquitectura de Sistemas

Septiembre 2017 - Enero 2018

5.2. La indirección

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.