Introducción a punteros en C [Parte I]
Viernes, 5 marzo 2010
Uno de los mayores problemas con los que me encontré cuando empecé a programar en C fue una inexistente explicación sobre como funcionan los punteros. No estaba muy seguro de para que funcionaba el famoso asterisco o el símbolo “&”, por lo que en muchas prácticas acababa programando por coincidencia. No soy experto en C, pero espero que esta pequeña introducción os ayude a manejaros con punteros.
¿Que es un puntero?
Ha de quedar claro desde un principio que los punteros son variables, aun que, como veremos más adelantes, son unas variables peculiares. En otros lenguajes de programación solemos definir las variables de la siguiente manera:
int variable;
variable = 2;
Los punteros, como su nombre indica son variables que “apuntan”. ¿Como es eso? Un puntero almacenan una dirección de memoria, cuyos valores suelen representarse de forma hexadecimal como 0xf8a87004. En esa dirección de memoria es donde almacenaremos los datos que nos interesan, ya sea un carácter, un número, o, aun que parezca enrevesado, otro puntero.
¿Como trabajo con puntero?
Los punteros en C se especifican con un asterisco antes del nombre de la variable. Por ejemplo:
char *variable;
Esto le dice al compilador que queremos crear un puntero que apunte a un área de memoria donde vamos a almacenar un carácter. Vamos a verlo con un poco de código:
char a;
char *pa;
a = ‘h’;
pa = malloc(1);
*pa = ‘k’;
free(pa);
En este ejemplo creamos dos variables, a y pa. La variable a es un char por lo que podemos hacer la asignación a=’h’ sin problemas. Sin embargo vemos que la variable pa está precedida de un asterisco, indicando que es un puntero a un char.
El asterisco antes del nombre de la variable indica a la maquina que lo que queremos es acceder a la memoria donde apunta pa.
También vemos una cosa nueva, la llamada malloc(int). He querido meterlo en este ejemplo para que os vayáis familiarizando con él, ya que se utiliza profusamente en C. Al hacer char *pa; estamos diciéndole que es un puntero a un carácter. Hasta aquí bien. ¿Pero donde se almacena ese carácter?¿Que dirección de memoria debemos utilizar? Esto es lo que nos resuelve la llamada a malloc(). Esta función lo que hace es reservar memoria libre para que podamos usarla y meter en ella cosas. ¿Cuanta? Eso se lo decimos mediante el parámetro que le pasamos a la función, esto es, el número de bytes que queremos reservar. Cuando está todo hecho, la función devuelve la dirección de memoria que ha reservado, por lo que la guardamos en pa y ya podemos trabajar con ella. Nada mejor que una imágen.

También es muy importante después liberar esa memoria mediante la llamada a la función free(puntero). De lo contrario esa memoria quedará marcada como en uso por el sistema y no podrá ser usada por otro programa, incluso si terminamos la ejecución del mismo. Imaginaos que reservamos memoria con malloc() en un bucle y nos olvidamos de poner free(). Si por cualquier motivo el bucle nunca termina (bucle infinito), estaremos reservando memoria ilimitadamente hasta que el sistema se quede sin ella. Este suceso (el de reservar memoria y no liberarla se denomina fuga de memoria o memory leak. Os podeís suponer en que estaba programando cuando abrí está página
¿Eso es todo?
¡No! El manejo de punteros tiene unas posibilidades enormes, como también son enormes las posibilidades de meter la pata a la hora de programar con ellos. Se pueden hacer punteros a puntero, creando listas de punteros, arrays, pasar a las funciones punteros en vez de valores, punteros a funciones…. Pero eso quizás más adelante para no liaros mucho la cabeza.
Os dejo este pequeño fichero en C para que podáis probar y cacharrear. Tiene más cosas de las que he hablado en esta pequeña introducción, como arrays o structs, de las que hablaré más adelante, pero no os asustéis y probad.
(click derecho, “Guardar como…”)
Espero que os sirva de ayuda.
Un saludo.


No. 1 — marzo 8th, 2010 at 16:08 pm
Habría pagado por una explicación así hace dos años. Qué malos recuerdos traen los punteros de C xD. ¡Te sigo!