Este sitio web usa cookies de terceros para analizar el tráfico y personalizar los anuncios. Si no está de acuerdo, abandone el sitio y no siga navegando por él. ×


11. Punteros y gestión dinámica de memoria

11.1. ¿Por qué usar estructuras dinámicas?

Hasta ahora teníamos una serie de variables que declarábamos al principio del programa o de cada función. Estas variables, que reciben el nombre de estáticas, tienen un tamaño asignado desde el momento en que se crea el programa.

Este tipo de variables son sencillas de usar y rápidas... si sólo vamos a manejar estructuras de datos que no cambien, pero resultan poco eficientes si tenemos estructuras cuyo tamaño no sea siempre el mismo.

Por ejemplo, si queremos crear una agenda, necesitaremos ir añadiendo nuevos datos. Si reservamos espacio para un máximo de 10 fichas, no podremos llegar a añadir la número 11. Una solución "típica" (pero mala) es sobredimensionar: preparar una agenda contando con 1000 fichas, aunque supongamos que no vamos a pasar de 200. Esto tiene varios inconvenientes: se desperdicia memoria, obliga a conocer bien los datos con los que vamos a trabajar, sigue pudiendo verse sobrepasado, etc. Otra (mala) solución sería la de trabajar siempre en el disco y usar acceso aleatorio para leer cada ficha desde disco cuando sea necesario, pero esta alternativa es muchísimo más lenta.

La solución real suele ser crear estructuras dinámicas, que puedan ir creciendo o disminuyendo según nos interese. En los lenguajes de programación "clásicos", como C y Pascal, este tipo de estructuras se tienen que crear de forma básicamente artesanal, mientras que en lenguajes modernos como C#, Java o las últimas versiones de C++, existen esqueletos ya creados que podemos utilizar con facilidad.

Algunos ejemplos de estructuras de este tipo son:

Y existen otras estructuras dinámicas más complejas y que nosotros no trataremos, como los árboles, en los que cada elemento puede tener varios sucesores (se parte de un elemento "raíz", y la estructura se va ramificando), o los grafos, formados por una serie de nodos unidos por aristas.

Todas estas estructuras tienen en común que, si se programan correctamente, pueden ir creciendo o decreciendo según haga falta, al contrario que un array, que tiene su tamaño (máximo) prefijado. Además, ciertas operaciones, como las ordenaciones o los borrados, pueden ser más rápidas que en un array.

Veremos ejemplos de cómo crear estructuras dinámicas de estos tipos en C#, usando las posibilidades que incluye la plataforma ".Net" y después comentaremos los pasos para crear una estructura dinámica de forma "artesanal".