Punteros

Los punteros también son variables y juegan un papel muy importante en el lenguaje de programación C. Se usan para diferentes cuestiones, tales como::

  • Cadenas de caracteres
  • Asignación de memoria dinámica
  • Pasar argumentos de funciones por referencia
  • Construir estructuras de datos complejas
  • Apuntar a funciones
  • Creación de estructuras de datos especiales (Listas, Árboles, etc...)

Entre otras

¿Qué es un puntero?

Un puntero es esencialmente una variable entera simple que contiene una dirección de memoria que apunta a un valor, en lugar de contener el valor real en sí.

La memoria de la computadora es un almacén secuencial de datos, y un puntero apunta a una parte específica de la memoria. Nuestro programa puede usar punteros de tal manera que los punteros apuntan a una gran cantidad de memoria, dependiendo de cuánto decidamos leer a partir de ese momento.

Cadenas como punteros

Ya hemos presentado las cadenas anteriormente, pero ahora podemos profundizar un poco más y comprender qué son las cadenas en C realmente

La siguiente línea:

char * nombre = "John";

hace tres cosas:

  1. Define una variable local llamada nombre, que es un puntero a un caracter.
  2. Hace que la cadena "John" aparezca en algún lugar de la memoria del programa (después de compilarlo y ejecutarlo).
  3. Inicializa el argumento nombre de forma que apunte a la zona de memoria donde se encuentra el caracter J (al cual sigue el resto de la cadena en la memoria).

Si tratamos de acceder a la variable nombre como una matriz, funcionará y devolverá el valor ordinal del carácter J, ya que la variable nombre en realidad apunta exactamente al comienzo de la cadena.

Como sabemos que la memoria es secuencial, podemos suponer que si avanzamos en la memoria al siguiente caracter, recibiremos la siguiente letra de la cadena, hasta que lleguemos al final de la cadena, marcada con un terminador nulo (el carácter cuyo valor ordinal es 0, anotado como \0).

Desreferencia

Desreferenciar la operación de referirse a donde señala el puntero, en lugar de la dirección de memoria. Ya estamos usando la desreferenciación en vectores. El operador corchete - [0] -por ejemplo, accede al primer elemento del vector. Y dado que los vectores son en realidad punteros, acceder al primer elemento del vector es lo mismo que desreferenciar un puntero. La desreferenciación de un puntero se realiza utilizando el operador asterisco *.

Si queremos crear un array que apunte a una variable diferente en nuestra pila, podemos escribir el siguiente código:

/* define una variable local a */
int a = 1;

/* define una variable puntero, y apunta a la variable a utilizando el operador & */
int * pointer_to_a = &a;

printf("The value a is %d\n", a);
printf("The value of a is also %d\n", *pointer_to_a);

Utilizamos el operador & para apuntar a la variable a, que acabamos de crear.

Después, nos referimos a él utilizando el operador de desreferencia (o indirección). También podemos cambiar el contenido de la variable desreferenciada:

int a = 1;
int * pointer_to_a = &a;

/* Modificamos la variable a */
a += 1;

/* Modificamos la variable a de nuevo */
*pointer_to_a += 1;

/* Imprimiremos el valor 3 */
printf("The value of a is now %d\n", a);

Ejemplo

Cree un puntero a la variable local n llamada pointer_to_n , y úselo para aumentar el valor de n en uno.