Punteros en C

Author
By Darío Rivera
Posted on 2022-08-05 in 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 cojunto 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.

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

Ingeniero de desarrollo en PlacetoPay , Medellín. Darío ha trabajado por más de 6 años en lenguajes de programación web especialmente en PHP. Creador del microframework DronePHP basado en Zend y Laravel.

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