Professional Documents
Culture Documents
(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 : 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
Datos La letra X El nmero 100 El nmero 125.123 La frase Aprenda usted mismo Una pgina escrita completamente
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.
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
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:
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:
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:
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?: