Punteros en 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);
}