logo

C – Puntero a puntero (puntero doble)

Requisito previo: Punteros en C

El puntero a un puntero en C se utiliza cuando queremos almacenar la dirección de otro puntero. El primer puntero se utiliza para almacenar la dirección de la variable. Y el segundo puntero se utiliza para almacenar la dirección del primer puntero. Por eso también se les conoce como doble puntero . Podemos usar un puntero a un puntero para cambiar los valores de los punteros normales o crear una matriz 2D de tamaño variable. Un puntero doble ocupa la misma cantidad de espacio en la pila de memoria que un puntero normal.



Declaración de puntero a un puntero en C

Declarar puntero a puntero es similar a declarar un puntero en C. La diferencia es que tenemos que colocar un '*' adicional antes del nombre del puntero.

subprograma subprograma
data_type_of_pointer **name_of_variable = & normal_pointer_variable;>
int val = 5; int *ptr = &val; // storing address of val to pointer ptr. int **d_ptr = &ptr; // pointer to a pointer declared  // which is pointing to an integer.>

El diagrama anterior muestra la representación en memoria de un puntero a un puntero. El primer puntero ptr1 almacena la dirección de la variable y el segundo puntero ptr2 almacena la dirección del primer puntero.

Ejemplo de doble puntero en C

C








// C program to demonstrate pointer to pointer> #include> int> main()> {> >int> var = 789;> >// pointer for var> >int>* ptr2;> >// double pointer for ptr2> >int>** ptr1;> >// storing address of var in ptr2> >ptr2 = &var;> >// Storing address of ptr2 in ptr1> >ptr1 = &ptr2;> >// Displaying value of var using> >// both single and double pointers> >printf>(>'Value of var = %d '>, var);> >printf>(>'Value of var using single pointer = %d '>, *ptr2);> >printf>(>'Value of var using double pointer = %d '>, **ptr1);> >return> 0;> }>

>

>

Producción

Value of var = 789 Value of var using single pointer = 789 Value of var using double pointer = 789>

¿Cómo funciona el doble puntero?

El funcionamiento del doble puntero se puede explicar utilizando la imagen de arriba:

  • El puntero doble se declara utilizando la sintaxis que se muestra arriba.
  • Después de eso, almacenamos la dirección de otro puntero como el valor de este nuevo puntero doble.
  • Ahora, si queremos manipular o desreferenciar cualquiera de sus niveles, tenemos que usar el operador Asterisco (*) la cantidad de veces que bajemos del nivel al que queremos bajar.

Tamaño de puntero a puntero en C

En el lenguaje de programación C, un puntero doble se comporta de manera similar a un puntero normal en C. Por lo tanto, el tamaño de la variable de puntero doble siempre es igual al de los punteros normales. Podemos verificar esto usando el siguiente programa C.

Ejemplo 1: Programa C para encontrar el tamaño de un puntero a un puntero.

C




cadena java cmp

// C program to find the size of pointer to pointer> #include> int> main()> {> >// defining single and double pointers> >int> a = 5;> >int>* ptr = &a;> >int>** d_ptr = &ptr;> >// size of single pointer> >printf>(>' Size of normal Pointer: %d '>,>sizeof>(ptr));> >// size of double pointer> >printf>(>' Size of Double Pointer: %d '>,>sizeof>(d_ptr));> >return> 0;> }>

>

>

Producción

 Size of normal Pointer: 8 Size of Double Pointer: 8>

Nota: El resultado del código anterior también depende del tipo de máquina que se esté utilizando. El tamaño de un puntero no está fijo en el lenguaje de programación C y depende de otros factores como la arquitectura de la CPU y el sistema operativo utilizado. Normalmente, para un sistema operativo de 64 bits, el tamaño será de 8 bytes y para un sistema operativo de 32 bits, el tamaño será de 4 bytes.

Aplicación de punteros dobles en C

Los siguientes son los usos principales de puntero a punteros en C:

para cada java
  • Se utilizan en la asignación de memoria dinámica de matrices multidimensionales.
  • Se pueden utilizar para almacenar datos multinivel, como párrafos de documentos de texto, oraciones y semántica de palabras.
  • Se utilizan en estructuras de datos para manipular directamente la dirección de los nodos sin copiar.
  • Se pueden utilizar como argumentos de función para manipular la dirección almacenada en el puntero local.

Punteros multinivel en C

Los punteros dobles no son los únicos punteros multinivel admitidos por el lenguaje C. ¿Qué pasa si queremos cambiar el valor de un puntero doble?

En este caso, podemos usar un puntero triple, que será un puntero a un puntero a un puntero, es decir, int ***t_ptr.

Sintaxis del triple puntero

  pointer_type *** pointer_name;>

De manera similar, para cambiar el valor de un puntero triple podemos usar un puntero a un puntero a un puntero a un puntero (Puntero de cuatro niveles). En otras palabras, podemos decir que para cambiar el valor de una variable de nivel – x podemos usar un puntero de nivel – x+1. Y este concepto se puede ampliar más.

Nota : Podemos usar cualquier puntero de nivel en C. No hay restricciones al respecto, pero hace que el programa sea muy complejo y vulnerable a errores.

Debe leer - Puntero de función en C