** 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
.
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 *
.
#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áctera
como valor. - Creé un puntero
char
ptr
y almacené la dirección de la variablech
. - Impreso la dirección y el valor de
ch
. - Impreso el valor del
ptr
, el valor delptr
será la dirección delch
- Impreso el valor de
ch
usando*ptr
. El valor deptr
es la dirección de la variablech
, 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 **
.
#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áctera
como valor. - Creé un puntero
char
ptr
y almacené la dirección de la variablech
. - Creó un puntero
char
al punteroptrToPtr
y almacenó la dirección de la variableptr
. - El ptr tendrá como valor la dirección de la variable
ch
, y elptrToPtr
tendrá como valor la dirección del punteroptr
. - Cuando desreferenciamos el
ptrToPtr
como*ptrToPtr
obtenemos la dirección de la variablech
- Cuando desreferenciamos el
ptrToPtr
como**ptrToPtr
obtenemos el valor de la variablech
Punto para recordar
Para almacenar la dirección de ptrToPtr
necesitamos crear
char ***ptrToPtrToPtr = &ptrToPtr;
printf("***ptrToPtrToPtr : %c\n", ***ptrToPtrToPtr); // 'a'