lunes, 24 de octubre de 2011

Punteros C Parte 2

Bien, como lo prometido es deuda voy a escribir una segunda parte acerca de punteros (Parte 1 y aclaraciones). Bien en esta segunda parte me dispondré a hablar acerca de otro modo de acceso a 'struct' con punteros (en lugar de "(*var).varStr"). Además hablaremos de la gestión dinámica de memoria. Esta gestión se realiza mediante los punteros. En particular veremos arrays de datos dinámicos. A la hora de realizar pilas, colas, árboles y demás estructuras de datos se debería ampliar con temas particulares. Para todos los que ya conozcáis la teoría acerca de estas estructuras saber que la referencia al siguiente (siguientes, anterior) elemento (o nodo) se realiza mediante 'struct' que contienen punteros del mismo tipo de la 'struct'.

Con lo visto hasta ahora cabe destacar la versatilidad de los punteros. Hemos visto ciertas utilidades de los punteros que nos pueden resultar muy útiles (el paso por referencia). Además en esta segunda parte veremos cómo un puntero puede actuar cómo un vector. Esto es debido a que en un vector disponemos datos en posiciones contiguas de memoria y en función del índice avanzamos. Ejemplo: tenemos un array "int v[4];" veamos la memoria:
Podemos ver que  'v' tiene sus 4 posiciones consecutivas en memoria de hay que podamos seleccionar cada una con un índice (desplazamiento en memoria). Es importante tener esto en cuenta, pues de esto podemos deducir que un array almacena la posición de memoria de su primer elemento. A la hora de pasar un array como parámetro de una función deberemos mandar su dirección y una variable que nos indique su tamaño. Para pasar la variable 'v' a una función deberemos: 'funcion(v;4)'. La dirección de memoria de 'v' la pasamos escribiendo el nombre del array solamente (el array apunta a la primera posición de memoria consecutiva).

Acabamos de ver cómo se guarda el array en memoria. A la hora de crear dinámicamente un array (utilizando un puntero) ocurre un hecho similar. Esto es la similitud que al crear dinámicamente el espacio se almacenara en posiciones consecutivas de memoria. Por tanto accederemos a los punteros de manera similar a los arrays. Os estaréis preguntando: "Esto es muy bonito, pero ¿cómo puedo crear dinámicamente el array?". Para realizar arrays dinámicamente deberemos conocer dos funciones: 'malloc(...)' y 'free (...)'. La función '(tipo*) malloc(nbytes);' debemos especificar el tipo de puntero (int, char, double, ...) y el nº de bytes que queremos reservar. A la hora de reservar espacio usaremos la función 'sizeof(tipo)' y los multiplicaremos por el nº de elementos que deseamos. Esta función devuelve un puntero que apunta a un bloque de memoria (consecutiva) de de los nbytes pasados (similar al array). Podemos acceder a los elementos del array de dos maneras:1. Como el array (mayor facilidad). 2. Sumando a la dirección de memoria. Los veremos en el ejemplo. La función 'free(puntero)' libera el espacio de memoria del puntero. ES MUY IMPORTANTE LIBERAR LA MEMORIA pues en C no es automático. Ejemplo:
EDITADO: Es necesaria la inclusion de la librería <malloc.h>. (Foto antes de compilar. Disculpad siempre pruebo todos los ejemplos, uno que no pruebo y pasa lo que pasa).

En el ejemplo generamos un array dinámicamente del tamaño introducido por pantalla. Escribimos los valores introducidos por teclado y los mostramos. Proximamente realizare una entrada con ejemplos de punteros, sus explicaciones y sus resultados. Podríamos crear punteros a punteros para crear arrays de 2 dimensiones (veremos ejemplos de esto, se puede apreciar sobre todo con arrays de char).

A continuación veremos cómo usar punteros de 'struct' de una manera diferente a la vista hasta ahora (Parte 1). Anteriormente si teníamos una 'struct fraccion *frac' y le pasamos una dirección de memoria para acceder a los elementos hacíamos: '(*frac).numerador' sin embargo podemos realizar la misma acción con: 'frac->numerador'. Ejemplo:


Me gustaría comentar que intentare subir entradas una vez cada 15 días como mínimo. Si deseáis alguna entrada en particular tan solo tenéis que comentarme. Proximamente aparte de los ejemplos de código con punteros hablare acerca de la creación de nuevos procesos y más adelante acerca de los hilos.

No hay comentarios:

Publicar un comentario