Herramientas para el acceso directo a memoria en C++ M.C. Juan Carlos Olivares Rojas 1
Agenda Apuntadores en C++. Relación entre arreglos y apuntadores en C+ +. Aritmética de apuntadores en C++. Memoria estática y dinámica Creación y uso de arreglos y objetos dinámicos en C++. Comparación con JAVA. 2
Apuntadores en C++. • Los apuntadores son variables que almacenan direcciones en lugar de datos. • Los apuntadores permiten apuntar hacia distintas localidades de memoria, por lo que se utilizan para generar memoria dinåmica. 3
Apuntadores en C++ • Los apuntadores pueden ser de cualquier tipo, se declaran anteponiendo un *: • int *puntero; //apuntador a un entero • char *cad; //apuntador a caractér • void *puntero; //puntero a cualquier tipo de dato 4
Relación entre arreglos y apuntadores en C++. • La relación que existe entre un arreglo y un apuntador es que el nombre de un arreglo representa una dirección de memoria y los subíndices representan un desplazamiento. • Las cadenas son arreglos de caracteres (apuntador a un carácter)
5
Aritmética de apuntadores en C++. • La aritmética de apuntadores significa poder desplazarse a través de la memoria. • Sólo se pueden utilizar los operadores +,-, ++, -- y otros operadores de manera indirecta. • El operador & se utiliza para obtener la dirección de una variable.
6
Memoria estática y dinámica • Los apuntadores se utilizan para crear memoria dinámica. • De manera predeterminada, las variables se crean con memoria estática en lo que se conoce como tiempo de ejecución, por eso se debe de definir un tamaño máximo en los arreglos. 7
Memoria Dinámica • La memoria dinámica se puede crear simplemente teniendo un tipo de dato puntero. • Por ejemplo para declarar un arreglo de enteros dinámicos, quedaría así: • int *arreglo; //no se especifica tamaño
8
Memoria Dinámica • En C se utiliza la función malloc para pedir memoria y free para liberarla. • arreglo = (int *) malloc(N * sizeof(int)); • free(arreglo); • En Java no existe como tal los punteros pero se puede utilizar memoria dinámica.
9
Memoria Dinámica • En C++ al igual que Java se utiliza el operador new para pedir memoria dinámica. De hecho en Java los arreglos deben crearse con el operador new: • int a[5] = new int[5]; //Java • int a[] = new int[N]; //C++ 10
Memoria Dinámica • delete [] a; • En Java no existe el concepto de liberar memoria ya que se hace de manera automática con el recolector de basura. • La memoria dinámica sirve para crear otros tipos de ADT más especializados como listas, pilas, colas, árboles, etc.
11
Memoria Dinámica • Al borrar un elemento se regresa la memoria que se pidió, por eso es importante liberar la memoria, ya que si no se hace se pierde ese pedazo. • Si se crea memoria dinámica para un objeto se puede llamar a su constructor para que lo inicialice. 12
Creación y uso de arreglos y objetos dinámicos en C++. Comparación con JAVA. • En Java no existe el concepto de puntero. Se pueden crear memoria dinámica. • En objetos al liberar memoria se invoca de manera automática al destructor en C++ y al método finalize() y variantes en Java. 13
Actividad • Realizar un programa que cree un arreglo con la mayor cantidad de números primos. • El usuario deberá introducir el tamaño del arreglo y este deberá hacerse a través de memoria dinámica. El límite lo marcará el tamaño de la memoria disponible. 14
多Preguntas, dudas y comentarios?
15