> For the complete documentation index, see [llms.txt](https://bla0x1s-organization.gitbook.io/untitled-1/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://bla0x1s-organization.gitbook.io/untitled-1/reverse-engineering/c-programming/pointers.md).

# POINTERS

Un puntero es una variable que almacena la direccion de memoria de otra variable como su valor.

Una variable de puntero apunta a un tipo de datos (como `int`) del mismo tipo y se crea con el \* operador.

La direccion de la variable con la que esta trabajando se asigna al puntero:

```c
int edad = 43;
int* ptr = &edad;

printf("%d\n", edad);

printf("%p\n", &edad);

printf("%p\n", ptr);
```

### Desreferencia

En el ejemplo usamos una variable de puntero para obtener la direccion de la memoria de una variable (usada junto con el operador & de referencia).

Tambien puede obtener el valor de la variable a la que apunta el puntero, utilizando el \* operador:

```c
int edad = 43;
int* ptr = &edad;

printf("%p/n", ptr);

printf("%d/n", *ptr);
```

## Pointers y Arrays

Tambien se pueden utilizar punteros para acceder a arrays:

```c
int numbers[4] = {25, 50, 75, 100};
```

En lugar de imprimir el valor de cada elemento del arreglo, imprimamos la direccion de memoria de cada elemento del arreglo:

```c
int numbers[4] = {25, 50, 75, 100};
int i;

for (i = 0; i < 4; i++) {
    printf("%p\n", &numbers);
}
```
