You are on page 1of 8

INTRODUCCIN A LAS ESTRUCTURAS DE DATOS Antes de pasar a la siguiente pgina le recomiendo que: Haga Clic aqu para ver

(Objeto Virtual de aprendizaje) que le ayudar a fortalecer sus conocimientos relacionados con la Unidad 1 del curso. Los Apuntadores y la Gestin Dinmica de Memoria Las variables son utilizadas por los programadores para almacenar datos de diferentes tipos segn sea el caso, entre ellas se diferencian las variables estticas y las dinmicas. Variables estticas Las variables estticas como recordamos en los inicios de los fundamentos de programacin, son aquellas que el programador les asigna memoria antes de la ejecucin del programa o de una funcin, las variables estticas se llaman mediante el nombre de la misma, que ha sido declarado por el programador. Variables dinmicas Las variables dinmicas deben su nombre al hecho de que pueden ser creadas y destruidas durante el tiempo de ejecucin de un mdulo. Para el manejo de variables dinmicas se hace indispensable la utilizacin de apuntadores, as como de funciones especiales para la asignacin y liberacin de la memoria correspondiente a dichas variables. Apuntadores Para entender qu es un puntero veremos primero cmo se almacenan los datos en un computador. La memoria de un computador est compuesta por unidades bsicas llamadas bits. Cada bit slo puede tomar dos valores, normalmente denominados alto y bajo, 1 y 0. Pero trabajar con bits no es prctico, y por eso se agrupan. Cada grupo de 8 bits forma un byte u octeto. En realidad el microprocesador, y por lo tanto nuestro programa, slo puede manejar directamente bytes o grupos de dos o cuatro bytes. Para acceder a los bits hay que acceder antes a los bytes. Cada byte tiene una direccin, llamada normalmente direccin de memoria. Conceptos bsicos Un apuntador es una variable, que almacena como contenido una direccin de memoria, de otra variable a la que apunta, dicha direccin representa el lugar donde se almacena un dato. Los apuntadores tienen un tipo de dato especfico y solo pueden apuntar a espacios de memoria con datos del mismo tipo. Por supuesto, a partir de esa direccin de memoria puede haber cualquier tipo de objeto: un char, un int, un float, un array, una estructura, una funcin u otro puntero. Seremos nosotros los responsables de decidir ese contenido. Con los apuntadores es posible manipular estructuras de datos o asignar memoria dinmica. Operaciones bsicas con apuntadores

Declaracin Los punteros se declaran con un asterisco, de esta forma: tipo *variable; Por ejemplo: int *puntero; Se dice que la variable puntero es un puntero a enteros (apunta a un entero). Asignacin El valor que puede adquirir un puntero es, por ejemplo, la direccin de una variable. El operador & devuelve la direccin de una variable: puntero = &variable; Desreferencia de un puntero Se puede alterar la variable a la que apunta un puntero. Para ello se emplea el operador de desreferencia, que es el asterisco: *puntero = 45; En este caso, se est introduciendo un 45 en la posicin de memoria a la que apunta puntero. Declaracin de apuntadores Los apuntadores son variables automticas cuyos valores representan direcciones de memoria correspondientes a otras variables. La sintxis para la declaracin de un apuntador es la siguiente: tipo *identificador ; Ejemplo: int *apunt; // Declaracin del apuntador apunt // Se dice que : "apunt va a apuntar a // variables de tipo int" donde; apunt es el nombre del apuntador y (*) es el operador de indireccin En el ejemplo anterior, puede decirse que: *apunt se refiere al objeto apuntado por apunt . apunt es un apuntador a objetos de tipo int Obsrve que el operador de indireccin utiliza el mismo smbolo que el operador de multiplicacin. En este caso el asterisco le indica al sistema que se define una variable apuntador. Ejemplos: int *x; x es un apuntador de tipo entero. char *y; y es un apuntador de tipo caracter. double *p, *q; p y q son apuntadores de tipo real doble precisin. Los operadores utilizados para trabajar variables apuntadores son el ( * ) asterisco llamado operador de indireccin, y el ( & ) ampersand, llamado operador de direccin.

* toma su operando como una direccin de memoria y retorna la informacin almacenada en ese lugar. & devuelve la direccin de memoria de su operando. Recordemos su utilizacin en el siguiente grupo de instrucciones: Veamos un ejemplo Apuntadores a apuntadores Como se vio al principio de la unidad, un apuntador tambin es una variable. Su direccin puede ser almacenada por otra variable apuntador, por lo que puede hablarse de un apuntador a un apuntador. Esto puede extrapolarse para dos o ms variables, como se observa en el ejemplo siguiente de apuntadores a apuntadores. #include <iostream.h> #include <conio.h> void main() { int x, *a, **b, ***c ; clrscr(); a = &x ; *a = 100 ; b = &a ; **b += *a ; c = &b ; ***c += **b + *a ; cout << " *a=" << *a << " \n" ; cout << " **b=" << **b << " \n" ; cout << "***c=" << ***c << " \n" ; getch(); } Explicando la lnea 1 del listado anterior se tiene. int x, *a, **b, ***c;

Se declaran: x como una variable de tipo entero. a como un apuntador a objetos de tipo entero. b como un apuntador a un apuntador, el cual a su vez apuntar a objetos de tipo entero. Se dice que b es "el apuntador del apuntador". c como un apuntador a un apuntador que apunta a otro apuntador, el cual a su vez apunta a objetos de tipo entero. Se dice que c es "el apuntador del apuntador del apuntador".
En las siguientes lineas de cdigo se tiene a = &x la cual que significa que: void main() { int x, *a, *b; a = &x ;

Su respuesta : la variable a guarda la direccin de memoria de la variable x Esta es la respuesta correcta

Un apuntador se puede definir como:

Su respuesta : Una variable que guarda como contenido la direccin de memoria de otra variable del mismo tipo a la que apunta. Esta es la respuesta correcta

En estructura de datos, las variablesson utilizadas por los programadores para almacenar datos de diferentes tipos segn sea el caso, podemos diferenciar entre ellas las variables estticas y las dinmicas. De a cuerdo a lo anterior se puede decir que el tipo de variable de las cuales pueden ser creadas y destruidas durante el tiempo de ejecucin de un mdulo o de un programa as como tambin este tipo de variable no presentan un tamao fijo predefinido por el programador porque este es asignado de acuerdo como se requiera. De acuerdo a lo anterior identifique entre las siguientes opciones el tipo de variable que cumple con estas caractersticas.

Su respuesta : Variables dinmicas Muy bien su respuesta es correcta las variables dinmicas se pueden crear y destruir en tiempo de ejecucin de un programa

los apuntadores en su aplicacin tambin son conocidos como un tipo de variables:

Su respuesta : Automticas Muy bien su respuesta es correcta

Gestin dinmica de memoria


Gestin dinmica de memoria Para iniciar este capitulo es importante que le demos un vistazo a la memoria de la computadora. Si usted ya sabe como funciona la memoria de la computadora, se puede saltar esta seccin. Sin embargo, si no est seguro, le sugiero que la lea, le ayudar a comprender mejor ciertos aspectos de la programacin. La computadora usa memoria de acceso aleatorio (RAM) para guardar informacin mientras esta en funcionamiento. La RAM se encuentra en circuitos integrados o chips en el interior de la computadora. La RAM es voltil, lo que significa que es borrada y reemplazada con nueva informacin tan pronto como se necesita. La volatilidad tambin significa que la RAM recuerda solamente mientras la computadora est encendida, y pierde su informacin cuando se apaga la computadora. Cada computadora tiene una determinada cantidad de RAM instalada. La cantidad de RAM en un sistema se especifica por lo general en Megabytes (Mb) por ejemplo 256 Mb, 512 Mb, en ese orden de ideas se dice un byte es la unidad de medida fundamental de la memoria de una computadora, de los cuales se obtiene los Kilobytes, Megabytes, Gigabytes, siendo estos los ms usados. Un kilobytes de memoria equivale a 1,024 bytes. Para darse una idea de que tantos bytes se necesitan para guardar determinados tipos de datos lo invito aque revise la siguiente tabla de espacios requeridos para guardar datos.

Datos La letra X El nmero 100 El nmero 125.123 La frase Aprenda usted mismo Una pgina escrita completamente

Bytes requeridos 1 2 4 21 3000 (Aproximadamente)

La RAM en la computadora est organizada en forma secuencial, un byte tras otro. Cada byte de memoria tiene una direccin nica mediante la cual es identificado, una direccin que tambin lo distingue de todos los otros bytes de la memoria. Las direcciones son asignadas a la memoria en orden, comenzando en 0 y aumentando hasta llegar al lmite del sistema. Para qu se usa la memoria RAM de la computadora?. Tiene varios usos, pero solamente uno, el almacenamiento de datos, le interesa al programador. Los datos significan la informacin con la cual trabaja un programa. Ya sea que el programa est trabajando con una lista de direcciones, monitoreando la bolsa de valores, manejando un presupuesto o cualquier otra cosa, la informacin (nombres, precios de acciones, gastos) es guardada en la RAM de la computadora mientras el programa est ejecutando. Hasta el momento, la mayoria de los programas los hemos realizado definiendo variables, sin preocuparnos de que se realiza intermaente en el computador, muchas veces en forma indiscriminada, es decir sin una verdadera depuracin, pero existen ocaciones en que no sabemos cuanta memora necesitaresmos para ejecucin de determinado programa, por ejemplo si deseamos realizar un procesador de textos, no sabemos cual va hacer la longitud del texto. Por eso a veces es necesario poder reservar memoria segn se va necesitando. Adems de esta forma nuestros programas aprovecharn mejor la memoria del computador en el que se ejecuten, usando slo los recursos necesarios.

Seleccione el numero de Bytes que la memoria de la computadora requiere para almacenar un dato de tipo float.

Su respuesta : 4 Bytes Esta es la respuesta correcta

El siguiente cdigo saca en pantalla el tamao de bits requeridos para un dato de

tipo short. De las siguientes opciones determine cul es la salida en pantalla. #include <iostream.h> #include <conio.h> int main () { cout<<"TIPOS DE DATOS Y TAMANO EN BITS\n\n"; cout<< "El tamano del tipo de dato es :"<<sizeof(short)*8<<" bits\n"; getch(); return 0; }

Su respuesta : El tamao del tipo de dato es: 16 bits Muy bien un dato de tipo short requiere 16 bits

Operadores New y Delete


Operadores New y Delete

El lenguaje C++ cuenta con dos operadores interconstruidos, ellos son: New y Delete, de tal manera que no se requiere incluir ningn archivo de cabecera para utilizarlos.

New que realiza una labor parecida a la de la funcin malloc(), asignando un bloque de memoria. Delete que libera un bloque de memoria asignada en tiempo de ejecucin, de manera semejante a como lo hace free().
La sintaxis para el uso del operador new es:

Apuntador = new tipo_de_dato;

Este operador hace una peticin al sistema operativo para que se le asigne un espacio de memoria, con tamao deacurdo al tipo de datos (recordemos la funcin sizeof), si este espacio esta disponible, la operacin regresa la direccin real que se otorga, en caso de no haber espacio regresa el balor de NULL (0), La sintaxis para el uso del operador delete es: delete apuntador; La ejecucin de este operador provoca que se libere espacio, dejando como valor indefinido, es decir el sistema operativo lo considera como memoria disponible. Hay una regla de oro cuando se usa memoria dinmica, toda la memoria que se reserve durante el programa hay que liberarla antes de salir del programa. No seguir esta regla es una actitud muy irresponsable, y en la mayor parte de los casos tiene consecuencias desastrosas. No os fiis de lo que diga el compilador, de que estas variables se liberan solas al terminar el programa, no siempre es verdad. El operador delete est definido para no hacer nada si se le pasa un valor NULL, se puede liberar la memoria ocupada por un dato al que apunta un puntero NULL, ya que realmente no se est haciendo nada. El operador delete slo puede utilizarse para liberar memoria reservada con el operador new. Si se usa delete con cualquier otro tipo de dato, la operacin no est definida, y por tanto nada sucede.

Las funciones estndar utilizadas en C para manejo dinmico de memoria, malloc(), calloc() y free(), tambin se pueden utilizar en C++ de la misma forma que en C. Los operadores new y delete no deben mezclarse con estas funciones, ya que los resultados pueden ser impredecibles. Si se est partiendo de cdigo C, lo mejor es continuar utilizando las funciones en las nuevas lneas de programa. Si no es as, se deben utilizar los nuevos operadores, ya que se han construido como parte del lenguaje en s, ms que aadirse, y por tanto son ms eficientes.

Cuando se utiliza new para reservar memoria para un vector, el tamao del vector se sita entre corchetes, siguiendo al tipo:

int *intvector; intvector = new int [20];

y se libera:

delete [ ] intvector;

En el lenguaje de programacin C++ para la gestin dinmica de memoria se utilizan New y Delete para asignar y liberar memoria respectivamente, este proceso se hace de forma dinmica en tiempo de ejecucin. New y delete son:

Su respuesta : Operadores Muy bien su respuesta es correcta

Act 4: Leccin evaluativa No.1 Funciones Malloc() y Free()


Gestin de memoria dinmica con las Funciones Malloc() y Free() Los variables y vectores en C ocupan un tamao prefijado, no pueden variarlo durante la ejecucin del programa. Por medio de punteros se puede reservar o liberar memoria dinmicamente, es decir, segn se necesite. Para ello existen varias funciones estndares, de la biblioteca <stdlib.h> La funcin malloc sirve para solicitar un bloque de memoria del tamao suministrado como parmetro. Devuelve un puntero a la zona de memoria concedida: void* malloc ( unsigned numero_de_bytes ); El tamao se especifica en bytes. Se garantiza que la zona de memoria concedida no est ocupada por ninguna otra variable ni otra zona devuelta por malloc . Si malloc es incapaz de conceder el bloque (p.ej. no hay memoria suficiente), devuelve un puntero nulo. Punteros void* La funcin malloc devuelve un puntero inespecfico, que no apunta a un tipo de datos determinado. En C, estos punteros sin tipo se declaran como void* Muchas funciones que devuelven direcciones de memoria utilizan los punteros void*. Un puntero void* puede convertirse a cualquier otra clase de puntero: char* ptr = (char*)malloc(1000); Operador sizeof El problema de malloc es conocer cuntos bytes se quieren reservar. Si se quiere reservar una zona para diez enteros, habr que multiplicar diez por el tamao de un entero. El tamao en bytes de un elemento de tipo T se obtiene con la expresin sizeof ( T ) El tamao de un char siempre es 1 (uno). Funcin free

Cuando una zona de memoria reservada con malloc ya no se necesita, puede ser liberada mediante la funcin free . void free (void* ptr); ptr es un puntero de cualquier tipo que apunta a un rea de memoria reservada previamente con malloc . Si ptr apunta a una zona de memoria indebida, los efectos pueden ser desastrosos, igual que si se libera dos veces la misma zona. Ejemplo de uso de malloc, free y sizeof #include <stdlib.h> int* ptr; /* puntero a enteros */ int* ptr2; /* otro puntero */ ... /* reserva hueco para 300 enteros */ ptr = (int*)malloc ( 300*sizeof(int) ); ... ptr[33] = 15; /* trabaja con el rea de memoria */ rellena_de_ceros (10,ptr); /* otro ejemplo */ ptr2 = ptr + 15; /* asignacin a otro puntero */ /* finalmente, libera la zona de memoria */ free(ptr); Obsrvese que hay que convertir el puntero void* devuelto por malloc a un int* , para que no haya incompatibilidad de tipos.

Cuando se realiza la asignacin dinmica de memoria haciendo uso de la funcin malloc() en la sintaxis del cdigo la funcin malloc() hace uso del operador sizeof el cual es requerido por esta funcin para:

Su respuesta : Determinar el nmero de bytes que se requiere reservar Muy bien su respuesta es correcta, el operador sizeof indica los bytes requeridos en la reserva de memoria

Una de las siguientes asignaciones de memoria es correcta, sabiendo que ptr es un puntero de tipo entero cual es?:

Su respuesta : ptr = (int*)malloc ( 300*sizeof(int) ); Esta es la respuesta correcta

You might also like