Punteros en C

Author
Por Darío Rivera
Publicado el en Lenguaje C

Un puntero o variable puntero es una variable que guarda la dirección de memoria de una variable. En este sentido podemos decir que una variable puntero apunta a otra variable. Este es un concepto muy importante en C ya que nos permite acceder a variables de manera mucho más eficiente.

Declaración de variables puntero

Una variable puntero puede ser declarada de la misma manera como se declara cualquier variable adicionando un asterisco justo antes del nombre de la variable (tipo *nom_var). Veamos el siguiente ejemplo en donde se imprime el valor y la dirección de memoria de una variable.

#include <stdio.h>

int main()
{
    int age = 30;
    int *dir_age;

    dir_age = &age;

    printf("La variable age tiene valor %d y dirección %p\n", age, dir_age);

    return 0;
}

Obtendrás una salida similar a la siguiente:

La variable age tiene el valor 30 y dirección 0x7ffe337ed7f4

Observa también que para acceder a la dirección de memoria de una variable siempre usaremos el operador de dirección ( & ).

Uso de punteros

Ya vimos en el ejemplo anterior cómo declarar y acceder a variables de tipo puntero. Ahora vamos a ver como utilizar un puntero para cambiar el valor de una variable utilizando su dirección de memoria. El siguiente ejemplo intercambiará los contenidos de las variables valor1 y valor2 usando los operandos de dirección y desreferencia.

#include <stdio.h>

int main()
{
    int valor1 = 10, valor2 = 20, temp;
    int *dir_int;

    dir_int = &valor1;
    temp = *dir_int;
    *dir_int = valor2;
    valor2 = temp;
}

Nota que hemos introducido el concepto de operador de desreferencia* ). La siguiente instrucción indica que se está accediendo al valor de la variable y no a su dirección de memoria.

*dir_int

En esencia es similar a haber ejecutado

valor1 = valor2;

Punteros a arrays

Recordemos que la declaración de un array es básicamente un conjunto de valores de tipo char. Ya lo hemos visto más a fondo en nuestro artículo Arrays en C.

char palindromo[] = "Arroz a la zorra";

Por otro lado la variable palindromo en realidad es un puntero a la dirección de memoria del primer elemento del array, por lo que técnicamente podemos utilizar indistintamente la variable en sí o la siguiente instrucción.

&palindromo[0]

Debido a esto, existe otra manera de expresar la asignación de una cadena de caracteres y es mediante un puntero de la siguiente forma:

char *palindromo = "Arroz a la zorra";

Esto no cambia en nada el funcionamiento del progama, podemos utilizar la variable palindromo de la manera usual en la mayoría de los casos. Esto es así, ya que recordemos que los valores de un array son guardados consecutivamente en la memoria de la máquina, lo que en realidad estamos haciendo, no es guardar la dirección de memoria de un array, es guardar la dirección de memoria del primer elemento del array.

Dicho esto, podemos acceder a los demás elementos del array aprovechando su manera consecutiva de almacenarse.

#include <stdio.h>

int main(void)
{
    char *palindromo = "Arroz a la zorra";

    printf("Segundo elemento: %c\n", *++palindromo);

    return 0;
}

La salida será en efecto:

Segundo elemento: r

El anterior ejemplo implica un conocimiento previo de aritmética de punteros que puedes ver en el siguiente artículo:

- Aritmética de punteros en C

Punteros a punteros

En C también es posible utilizar punteros que apunten a otros punteros. Para esto, basta agregar un asterisco de más a la declaración del puntero así.

int **dir_entero;

El número de punteros que tienen que ser seguidos para acceder a un elemento de información, o más bien la cantidad de asterísticos en la definición indican el nivel de indirección de la variable puntero. Observa el siguiente ejemplo en donde se utilizan punteros a punteros.

#include <stdio.h>

int main()
{
    int dato_int = 5;
    int *dir_dato_int;
    int **dir_dir_dato_int;

    dir_dato_int = &dato_int;
    dir_dir_dato_int = &dir_dato_int;

    printf("El valor de dato_in es %d\n", **dir_dir_dato_int);
}

Acerca de Darío Rivera

Author

Application Architect at Elentra Corp . Quality developer and passionate learner with 10+ years of experience in web technologies. Creator of EasyHttp , an standard way to consume HTTP Clients.

LinkedIn Twitter Instagram

Sólo aquellos que han alcanzado el éxito saben que siempre estuvo a un paso del momento en que pensaron renunciar.