** en C

Jagathish 12 octubre 2023
  1. Asignación de memoria para variable en C
  2. Puntero C
  3. Puntero a Puntero (**) en C
** en C

Este tutorial enseña cómo usar el puntero a puntero (puntero doble o **) para almacenar la dirección de otra variable de puntero.

Asignación de memoria para variable en C

Al crear una variable, habrá un bloque específico de memoria asignado a esa variable para almacenar el valor. Por ejemplo, hemos creado una variable char ch y valor a. Internamente, se asignará un byte de memoria a la variable ch.

Asignación de memoria

Puntero C

En programación C, un puntero es una variable que almacena la dirección de otra variable. Para acceder al valor presente en esa dirección, usamos *.

Ilustración de puntero

#include <stdio.h>

int main() {
  char ch = 'a';    // create a variable
  char *ptr = &ch;  // create a pointer to store the address of ch

  printf("Address of ch: %p\n", &ch);  // prints address
  printf("Value of ch: %c\n", ch);     // prints 'a'

  printf("\nValue of ptr: %p\n", ptr);  // prints the address of a
  printf("*ptr(value of ch): %c\n",
         *ptr);  // Prints Content of the value of the ptr
}

Producción :

Address of ch: 0x7ffc2aa264ef
Value of ch: a

Value of ptr: 0x7ffc2aa264ef
*ptr(value of ch): a

En el código anterior,

  • Creó una variable char ch y le asignó el carácter a como valor.
  • Creé un puntero char ptr y almacené la dirección de la variable ch.
  • Impreso la dirección y el valor de ch.
  • Impreso el valor del ptr, el valor del ptr será la dirección del ch
  • Impreso el valor de ch usando *ptr. El valor de ptr es la dirección de la variable ch, en esa dirección está presente el valor 'a', por lo que se imprimirá.

Puntero a Puntero (**) en C

Para almacenar la dirección de una variable, usamos un puntero. De manera similar, para almacenar la dirección de un puntero, necesitamos usar ** (puntero a puntero). ** denota un puntero que almacena la dirección de otro puntero.

Para imprimir el valor presente en la variable puntero a puntero, necesitamos usar **.

Ilustración de puntero a puntero

#include <stdio.h>

int main() {
  char ch = 'a';           // create a variable
  char *ptr = &ch;         // create a pointer to store the address of ch
  char **ptrToPtr = &ptr;  // create a pointer to store the address of ch

  printf("Address of ch: %p\n", &ch);  // prints address of ch
  printf("Value of ch: %c\n", ch);     // prints 'a'

  printf("\nValue of ptr: %p\n", ptr);   // prints the address of ch
  printf("Address of ptr: %p\n", &ptr);  // prints address

  printf("\nValue of ptrToPtr: %p\n", ptrToPtr);  // prints the address of ptr
  printf("*ptrToPtr(Address of ch): %p\n",
         *ptrToPtr);  // prints the address of ch
  printf("**ptrToPtr(Value of ch): %c\n", **ptrToPtr);  // prints ch
}

Producción :

Address of ch: 0x7fffb48f95b7
Value of ch: a

Value of ptr: 0x7fffb48f95b7
Address of ptr: 0x7fffb48f95b8

Value of ptrToPtr: 0x7fffb48f95b8
*ptrToPtr(Address of ch): 0x7fffb48f95b7
**ptrToPtr(Value of ch): a

En el código anterior,

  • Creó una variable char ch y le asignó el carácter a como valor.
  • Creé un puntero char ptr y almacené la dirección de la variable ch.
  • Creó un puntero char al puntero ptrToPtr y almacenó la dirección de la variable ptr.
  • El ptr tendrá como valor la dirección de la variable ch, y el ptrToPtr tendrá como valor la dirección del puntero ptr.
  • Cuando desreferenciamos el ptrToPtr como *ptrToPtr obtenemos la dirección de la variable ch
  • Cuando desreferenciamos el ptrToPtr como **ptrToPtr obtenemos el valor de la variable ch

Punto para recordar

Para almacenar la dirección de ptrToPtr necesitamos crear

char ***ptrToPtrToPtr = &ptrToPtr;
printf("***ptrToPtrToPtr : %c\n", ***ptrToPtrToPtr);  // 'a'

Artículo relacionado - C Pointer