Los punteros también pueden representar el concepto de
indirección múltiple (ver sección 5.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.
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.