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).
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.
Comentarios
Publicar un comentario