Universidad Carlos III de Madrid

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

Arquitectura de Sistemas

Septiembre 2012 - Enero 2013

6. Punteros a punteros

Los punteros también pueden representar el concepto de indirección múltiple (ver sección 2). La regla de derivación por la que de un tipo T se deriva el tipo puntero a T también se puede aplicar a este nuevo puntero para obtener el tipo puntero a puntero a T definido como T **.

Estos punteros múltiples tienen el mismo tamaño que un puntero simple, la diferencia sólo está en el número de indirecciones para obtener el dato. El siguiente programa es un ejemplo en el que se manipulan punteros con varios niveles de indirección:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
int main() 
{
    int i;
    int *ptrToi;           /* Puntero a entero */
    int **ptrToPtrToi;     /* Puntero a puntero a entero */

    ptrToPtrToi = &ptrToi; /* Puntero contiene dirección de puntero */
    ptrToi = &i;           /* Puntero contiene dirección de entero */

    i = 10;                /* Asignación directa */
    *ptrToi = 20;          /* Asignación indirecta */
    **ptrToPtrToi = 30;    /* Asignación con doble indirección */

    return 0;
}

La siguiente figura muestra la evolución del valor de todas las variables durante la ejecución del código. Nótese que aunque no hay ningún valor asignado a la variable i, la dirección de cualquier variable sí puede ser obtenida y almacenada sin problemas.

Sugerencia

Copia y pega el contenido del programa anterior en un fichero de texto en tu entorno de desarrollo. Utiliza la instrucción printf("%d\n", x); para imprimir el entero al que se refiere x. Modifica las asignaciones e imprime el valor de las variables para mostrar el funcionamiento de la indirección.