Clase 3: Punteros y Referencias

Slides:



Advertisements
Presentaciones similares
Curso de java básico (scjp)
Advertisements

Unidad 15 Características de C++ no relacionadas con el DOO.
Curso de java básico (scjp)
Procedimientos y Funciones
Direcciones, Arreglos y Argumentos de Funciones
Tipos de Datos Básicos y Estructurados
Punteros Universidad Nacional Mayor de San Marcos
INFORMATICA I Arreglos 1 CLASE 17.
Informática II Prof. Dr. Gustavo Patiño MJ
Informática II 1 Diego Fernando Serna RestrepoSemestre 2011/2.
Informática II 1 Diego Fernando Serna RestrepoSemestre 2011/2.
Tema 1. Introducción a la programación (Lenguaje java).
Informática II 1 Diego Fernando Serna RestrepoSemestre 2011/2.
Informática II 1 Diego Fernando Serna RestrepoSemestre 2011/2.
Informática II 1 Diego Fernando Serna RestrepoSemestre 2011/2.
Estructuras de Datos Punteros y algo más.
Unidad 3 Punteros.
Herramientas para el acceso directo a memoria en C++
¿Qué es un PUNTERO?: Un puntero es un objeto que apunta a otro objeto. Es decir, una variable cuyo valor es la dirección de memoria de otra variable. No.
Vectores en java.
Tema 7: Polimorfismo Antonio J. Sierra. Índice Introducción. Sobrecarga de métodos. Objetos como parámetros. Paso de argumentos. Devolución de objetos.
El lenguaje de programación C - Funciones -

Material de apoyo Unidad 2 Estructura de datos
POO Java Módulo 3 Elementos de programas Identificadores
Clases y objetos La unidad fundamental de programación OO son las clases. Conjunto de métodos y semántica Qué se va a hacer POO Clase: que define la implementación.
Tema 6: Clases Antonio J. Sierra.
Diseño de algoritmos “Punteros”
SCJP Sun Certified Programmer for Java 6
Práctica 7 AOC. Gestión de la pila Una pila es una estructura de datos caracterizada por que el último dato que se almacena es el primero que se obtiene.
Semana 5 Subprogramas..
Introducción a los punteros
Capítulo 5. Punteros y Cadenas de Caracteres
UNIDAD V Arreglos y Cadenas
Índice. Revisando conceptos acerca de la memoria.
Estructuras.
TABLAS Definición. El tipo tabla permite definir objetos formados por un conjunto de elementos del mismo tipo. Ejemplos. El tipo tabla se utiliza para.
Clase 10: Estructuras de datos y arreglos.
Unidad VI Registros (estructuras, uniones y enumeraciones)
COMPUTACIÓN I TEMA 6. Pasaje de parámetros por Referencia. Uso de apuntadores Prof. Mireya Morales.
Programación I Técnico Universitario en Web Dpto. de Informática FCFMyN - UNSL -11-
PUNTEROS Ing Anghello Quintero.
Informática Ingeniería en Electrónica y Automática Industrial
El lenguaje de programación C - Vectores y matrices -
Resumen Fundamentos de Programación/ Programación I
Unidad II Introducción a la programación en C++

Herencia y tipos ● Cuanta memoria se debe asignar a un objeto cuando se asigna en la pila ● La asignación debe hacerse antes de que se conozca la cantida.
APRENDIZ: SANDRA L. CAICEDO C. ORDEN: 20194
Informática Ingeniería en Electrónica y Automática Industrial
Memoria estática versus dinámica con Estructuras
Programación en C para electrónicos
Listas Ligadas Simples. Definíción I  Es, en sencillas palabras. un grupo de datos organizados secuencialmente, pero a diferencia de los arreglos, la.
PUNTEROS Y REFERENCIAS
APUNTADORES.
1 Definición y Conversión de datos Agustín J. González ELO-329.
Memoria dinámica con Estructuras. Memoria dinámica ¿Qué hacer cuando las variables declaradas son insuficientes o cuando no se conoce anticipadamente.
Programación Orientada a Objetos
Elementos básicos del lenguaje
Los punteros Programación modular.
Sesión 07: Manejo Dinámico de Memoria
Computación II Capitulo VII Punteros. Presentación de la unidad Objetivos: –Ser capaces de utilizar punteros. –Comprender las relaciones entre punteros,
1 Asignación Dinámica de Memoria Agustín J. González ELO 329.
Arreglos unidimensionales
6. Clases y Métodos..  6.1 Structs  6.2 Funciones  6.3 Namespaces  6.4 Clases.
MEMORIA DINÁMICA.
1 Definición y Conversión de datos Agustín J. González ELO-329.
Tema 1. Estructuras de datos Objetivo: Objetivo: El alumno resolverá problemas de almacenamiento, recuperación y ordenamiento de datos y las técnicas de.
Métodos en Java. Estructura de un programa en Java ► La relación con la vida misma la podemos ver en el siguiente comentario: Imaginemos que dos clases.
Lenguaje de Programación II Prof. Rafael Montenegro B. Carrera: T.S.U en Informática Periodo: 2014-I.
Transcripción de la presentación:

Clase 3: Punteros y Referencias Informática II Clase 3: Punteros y Referencias Diego Fernando Serna Restrepo Semestre 2011/2

Chiste del Día Informática II 2011/2

Contenido Qué son punteros 1 Cómo declarar y usar punteros? 2 3 Free store - Stack 4 Cómo manipular la memoria Informática II 2011/2

Punteros Es un tipo de variable implementada para almacenar exclusivamente direcciones de otras variables, estos se debe declarar y definir de acuerdo al tipo de dato que apunta. Utilizando punteros un programa puede realizar muchas tareas que no sería posible utilizando tipos de datos estándar. Informática II 2011/2

Características de un apuntador Un puntero es una variable como cualquier otra. Excepto que solo puede almacenar direcciones de otras variables común y corrientes. Un puntero apunta a una variable en memoria. Son útiles para pasar y regresar valores a la rutina que las llama. Si son usadas incorrectamente se pueden convertir en fuente de fallas y frustraciones. El tipo de variable que almacena una dirección se denomina puntero. Informática II 2011/2

Punteros Los punteros siempre deben inicializarse. Aquellos punteros que son inicializados con un valor igual a cero (0), se denominan punteros NULL. Se utiliza la palabra reservada VOID en la declaración de apuntadores, cuando se quiere que el puntero pueda apuntar a cualquier tipo de variables, int , char, float,…. Aquellos punteros que no sean inicializados a ningún valor se denominan “wild pointer”, y son extremadamente peligrosos pues pueden estar apuntando a cualquier cosa. Informática II 2011/2

Violación de seguridad de la memoria “Dangling pointer” Un objeto apuntado se suprime sin modificar el puntero Si se reasigna ese espacio libre en memoria, el puntero referenciará la nueva variable (allocate),. “Wild pointer” Se crea un puntero y se usa antes de la inicialización El puntero puede estar apuntado a cualquier posición desconocida de memoria Generan corrupción de datos y posiblemente fallos de segmentación. Informática II 2011/2

¿Para que se usan los punteros? Ж Manipular datos en el Free store (Heap). Acceder a las variables miembro y métodos de un objeto. Pasar variables por referencia a las funciones Gestionar y administrar datos en memoria. El utilizar punteros como valor de retorno permite superar la limitación de las funciones de devolver un único valor. Informática II 2011/2

Contenido Qué son punteros 1 Cómo declarar y usar punteros? 2 3 Free store - Stack 4 Cómo manipular la memoria Informática II 2011/2

Variables y memoria Apuntadores Cuando se declara una variable en C++, el compilador establece un área de memoria para almacenar el contenido de la variable. Esa variable se sitúa en una posición específica de la memoria, conocida como dirección de memoria. 1000 1001 1002 1003 1004 1005 1000 1001 1002 y 1003 1004 z 1005 1000 1001 1002 y 1003 1004 1005 25 77 25 Se utilizan los apuntadores para optimizar el acceso a esas variables. int y=25; Un puntero en C++ es una Variable que SOLO guarda la dirección de memoria de otra variable. int z=77; Informática II 2011/2

Variables y memoria 25 77 &y = 1002 y = 25 y = 25 MEMORIA int y = 25; #include <iostream> using namespace std; void main() { int y = 25; int z=77; int y = 25; int z=77; cout << " y= " << y << endl; / * visualiza el valor de y * / cout << " y= " << y << endl; / * visualiza el valor de y * / cout << " Dir y= " << &y << endl; / * visualiza dirección de y * / cout << " Dir y= " << &y << endl; / * visualiza dirección de y * / } 1000 1001 1002 1003 1004 1005 1000 1001 1002 y 1003 1004 z 1005 25 77 y = 25 &y = 1002 y = 25 Informática II 2011/2

Declaración de Apuntadores Como cualquier variable, las variables punteros han de ser declaradas antes de utilizarlas. Se utiliza asterisco (*) para indicar que la variable es variable apuntador. tipoDatoApuntado * nombreVbleApuntador; Ejemplos: int *ptr1; // Puntero a un tipo de dato entero (int) char *ptr2; / * Puntero a un tipo de dato char * / float *f; / * Puntero a un tipo de dato float * / SIEMPRE que aparezca un asterisco ( * ) en una definición de una variable, ésta es una variable puntero. Informática II 2011/2

Inicialización de Apuntadores El operador '&', permite conocer la dirección en memoria de una variable. &vble; Los punteros pueden trabajar con esas direcciones. 53 Cout << " y= " << y<< endl; 0x5010 0x5011 0x5012 y 0x5013 0x5014 0x5015 y = 53 cout << " &y= " << &y<<endl; &y = 0x5012

Inicialización de Apuntadores int i; /* define una variable i */ int *ptr; /* define un puntero a un entero ptr*/ ptr=&i; /* Almacene la dirección de i en ptr */ Se puede acceder al valor de i por medio del apuntador ptr. 0x5020 var1 0x5021 0x5022 i 0x5023 0x5024 0x8090 ptr 0x5020 0x5021 0x5022 0x5023 0x5024 0x8090 0x5020 var1 0x5021 0x5022 i 0x5023 0x5024 0x8090 0x5020 var1 0x5021 0x5022 0x5023 0x5024 0x8090 4 3 …….. 0x5022 4 …….. 0x5022 3 …….. 0x5022 3 …….. 0x5022 3 …….. …….. void main() { int var1; int i=3; int *ptr; ptr = &i; var1=*ptr; var1++; *ptr=var1; } Informática II 2011/2

Ejemplo Apuntadores unsigned short int edad = 50; // creación de variable unsigned short int * pEdad = 0; // creación de //puntero. pEdad = &edad; // asignando la dirección de edad en pEdad. cout << pEdad; // imprimiendo la dirección guardada en pEdad. cout << *pEdad; // imprimiento el valor al que apunta el puntero. Informática II 2011/2

Ejemplo Apuntadores #include <archivo_cabecera> int main() { int i,j; int *p; p = &i; *p = 5; j = i; return 0; } Apuntador: Un apuntador no es mas que una variable que almacena una dirección de memoria. Acceso indirecto Desreferenciar * Referenciar. & Informática II 2011/2

Operadores con Apuntadores Operadores Vistos & * Obtiene la dirección de una variable. Define una variable como puntero. Obtiene el contenido de una variable puntero. C++ requiere que las variables puntero direccionen realmente variables del mismo tipo de dato que está ligado a los punteros en sus declaraciones. Informática II 2011/2

Punteros a Punteros PUNTEROS A PUNTEROS Un puntero puede apuntar a otra variable puntero. Este concepto se utiliza con mucha frecuencia en programas complejos de C++. Se hace uso del operador * dos veces Ejemplo: Declaremos una variable tipo carácter, también un apuntador a esta variable. Y luego declaremos un puntero que apunte a este ultimo puntero. char letra = ´A´; char *ptr1 = &letra; char **ptr2 = &ptr1; Para acceder al contenido de letra se puede hacer por medio de: La misma variable El apuntador ptr1 El apuntador ptr2 Informática II 2011/2

Aritmética de punteros ARITMETICA DE PUNTEROS Es muy útil hacer que un puntero apunte a un elemento en memoria que este antes o después del dato originalmente apuntado. dato1 dato2 dato3 ptr 34 21 18 …. Si dato1,2 y 3 estan en posiciones contiguas de memoria, se puede recorrer todas estas posiciones con un apuntador, realizando la suma o la resta a este puntero (dirección de memoria). int dato1=34,dato2=21,dato3=18; int *ptr=&dato1; ptr=ptr+1; //Queda apuntando a dato2 ptr++; //Queda apuntando a dato3 ptr--; //Apunta de nuevo a dato2 Informática II 2011/2

Apuntadores y arreglos PUNTEROS Y ARREGLOS En C++ se pueden direccionar arreglos como si fueran punteros y viceversa int arreglo[4] = {2, 3, 10, 8}; int *ptrArr; arreglo[0] arreglo[1] arreglo[2] arreglo[3] 6050 arreglo 6052 6054 6056 6058 ptrArr 6050 arreglo 6052 6054 6056 6058 2 3 10 8 …… 2 3 10 8 …… 6050 *ptrArr *(ptrArr+1) *(ptrArr+2) *(ptrArr+3) ptrArr ptrArr+1 ptrArr+2 ptrArr+3 ptrArr=&arreglo[0]; Informática II 2011/2

Arreglo de punteros PUNTEROS Y ARREGLOS Un arreglo de caracteres es una colección de variables tipo caracter Un arreglo de punteros es ……. int *arrPtr[7]; arrEnt[0] arrEnt[1] arrEnt[2] arrPtr[0] arrPtr[1] arrPtr[2] arrPtr[3] 12 32 7 …. &var1 &var2 &var3 arrPtr[0] arrPtr[1] arrPtr[2] arrPtr[3] arrPtr[4] arrPtr[5] arrPtr[6] &var1 &var2 &var3 &varX NULL Informática II 2011/2

Arreglo de punteros PUNTEROS Y ARREGLOS Ejemplo: Declare tres cadenas de caracteres e inicialicelas, declare un arreglo de vectores, y apunte con cada puntero a cada uno de las cadenas. char cad1[10]={'C', 'A', 'R', 'L', 'O', 'S', '\0'}; arrPtr[0] arrPtr[1] arrPtr[2] arrPtr[3] char cad2[10] = "MARIA"; &cad1[0] &cad2[0] &cad3[0] NULL &cad1[0] &cad2[0] &cad3[0] &cad1[0] &cad2[0] &cad1[0] char cad3[] = {' L', 'U', 'I', 'S', 'A', '\0'}; char *arrPtr[4]; arrPtr[0]=cad1; //Es lo mismo que &cad1[0] arrPtr[1]=&cad2 [0]; //Es lo mismo que cad2 arrPtr[2]=cad3; //Es lo mismo que &cad3[0] arrPtr[3]=NULL; while (arrPtr[i] != NULL){ printf("%s",arrPtr[i]); i++; } Informática II 2011/2

Contenido Qué son punteros 1 Cómo declarar y usar punteros? 2 3 Free store - Stack 4 Cómo manipular la memoria Informática II 2011/2

Modo de almacenamiento El modo de almacenamiento (storage class) es otra característica de las variables de C++ que determina cuándo se crea una variable, cuándo deja de existir y desde dónde se puede acceder a ella. Auto Es creada al comenzar a ejecutarse un bloque de código y deja de existir cuando el bloque se termina de ejecutar. (Por defecto) Extern Estas variables existen durante toda la ejecución del programa. Una variable extern es definida o creada el momento en el que se le reserva memoria. permiten transmitir valores entre distintas funciones y ficheros Static static se declaran dentro de un bloque como las auto, pero permanecen en memoria durante toda la ejecución del programa como las extern. La inicialización sólo se realiza la primera vez. Register Este modo es una recomendación para el compilador, con objeto de que si es posible ciertas variables sean almacenadas en los registros de la CPU y los cálculos con ellas sean más rápidos. Informática II 2011/2

Espacios de memoria Segmento de código Memoria estática Reservada antes de la ejecución del programa Permanece fija. No requiere gestión durante la ejecución. El sistema operativo se encarga de la reserva, recuperación y reutilización. Se accede a un espacio en esta cada vez que se declaran Variables globales o tipo static. Es una zona de memoria donde se reservan y se liberan “trozos” durante la ejecución de los programas según sus propias necesidades, este proceso es usualmente llamado gestión de memoria dinámica. Optimiza el almacenamiento de datos. Es una zona de memoria que gestiona las llamadas a funciones durante la ejecución de un programa. Cada vez que se realiza una llamada a una función en el programa, se crea un entorno de programa que se libera cuando acaba su ejecución. La reserva y liberación de la memoria la realiza el S.O. de forma automática durante la ejecución del programa. Segmento de código Memoria estática Free store (Heap) Espacio Libre Stack (Pila) Informática II 2009/2

“Free store” – “Heap” El Free Store es un espacio de memoria muy grande, donde es posible almacenar información; solo puede ser manipulado por medio de punteros. A diferencia que en el Stack, la memoria reservada en el Free Store no se libera sino hasta que se termina el programa o es liberada manualmente. TIP: Usualmente se usan los destructores para liberar la memoria Informática II 2011/2

“Free store” – “Heap” Para reservar memoria en el Heap es necesario usar el comando new, el cual devuelve la dirección donde se reservó la variable. typedef unsigned short int USHORT; USHORT * pPuntero; pPuntero = new USHORT; /*también es posible hacerlo todo en una sola línea. USHORT * pPuntero = new USHORT; */ Informática II 2011/2

Gestión dinámica de memoria Petición al S.O. (tamaño) El S.O. comprueba si hay suficiente espacio libre. Si hay espacio suficiente, devuelve la ubicación donde se encuentra la memoria reservada, y marca dicha zona como memoria ocupada. Informática II 2011/2

Gestión dinámica de memoria 4. La ubicación de la zona de memoria se almacena en una variable estática (p1) o en una variable automática (p2). Nota: Si la petición devuelve una dirección de memoria, p1 y p2 deben ser variables de tipo puntero al tipo de dato que se ha reservado. Informática II 2011/2

Gestión dinámica de memoria 5. A su vez, es posible que las nuevas variables dinámicas creadas puedan almacenar la dirección de nuevas peticiones de reserva de memoria. Informática II 2011/2

Gestión dinámica de memoria 6. Una vez que se han utilizado las variables dinámicas y ya no se van a necesitar más es necesario liberar la memoria que se está utilizando e informar al S.O. que esta zona de memoria vuelve a estar libre para su utilización. Informática II 2011/2

Gestión dinámica de memoria 1 Reservar memoria. 2 Utilizar memoria reservada. 3 Liberar memoria reservada. Informática II 2011/2

Contenido Qué son punteros 1 Cómo declarar y usar punteros? 2 3 Free store - Stack 4 Cómo manipular la memoria Informática II 2011/2

Operador new Un operador que reserva la cantidad de memoria deseada en tiempo de ejecución. new reserva una zona de memoria en el Heap del tamaño adecuado para almacenar un dato de cualquier tipo, devolviendo la dirección de memoria donde empieza la zona reservada. Si new no puede reservar espacio (Ej. no hay suficiente memoria disponible), se provoca una excepción y el programa termina. La única forma de crear, modificar, acceder o eliminar una variable en el Heap es a través de un puntero. Se puede gestionar memoria para almacenar variables de tipo predefinido (int, float, double, …) al igual que los tipos de datos creados por el usuario (estructuras, clases…). Informática II 2011/2

Liberando la memoria del heap Para liberar la memoria del HEAP se usa el comando delete sobre el puntero. delete pPuntero; Es MUY importante liberar la memoria del Heap, pues en caso de perder el rastro de los punteros podrán presentarse “fugas de memoria” Informática II 2011/2

Operador delete El operador delete no elimina el puntero, simplemente lo desreferencia. Cuando se utiliza el operardo delete más de una vez, puede generar que el programa se estrelle, por ello es recomendable inicializar el puntero a NULL, haciendo esto se garantiza mayor seguridad, y de este modo se puede volver a reutilizar el puntero. int *ptr =new int; //reserva memoria delete ptr; //desreferncia ptr ptr=NULL; //lo lleva a NULL delete ptr; //no hay problema //se puede volver a referenciar a otro espacio de memoria ptr=new int; Informática II 2011/2

Fugas de memoria Cuando “se pierde de vista” la dirección o el puntero que lleva registro del espacio en el Heap, se dice que hubo una fuga de memoria. La memoria desperdiciada por causa de fugas de memoria, NO podrá liberarse sino hasta que termine el programa. Informática II 2009/2

Fugas de memoria Es muy frecuente que ocurra cuando el puntero es declarado como variable local (dentro de una función) y luego se sale de ésta sin antes liberar la memoria. Es muy común usar los constructores para reservar memoria en el heap y los destructores para liberarla. ¡OJO!, realizar un delete sobre un puntero libera la memoria, realizarlo de nuevo estrellará el programa. Para que esto no ocurra, asígnele al puntero el valor de cero DESPUÉS de hacer el primer delete. Informática II 2009/2

Uso de objetos en el free store La asignación de un objeto en el Heap es igual que la asignación de cualquier otro tipo Gato * pPelusa = new Gato; /*Este comando creará un objeto tipo Gato en el Heap, llamando su contructor*/ Informática II 2009/2

Accediendo a los miembros de una clase //Las siguientes lineas hacen lo mismo (* pCat).numeroPatas(); pCat->numeroPatas(); Informática II 2009/2

Apuntadores como datos miembro Todas las variables pueden ser declaradas para que habiten en el Heap, incluso las variables miembro de los objetos. Informática II 2009/2

El Puntero “this” Todas las clases tienen un puntero escondido denominado “this”, el cual apunta sobre la dirección del objeto en cuestión. No hay necesidad de preocuparse de la creación ni el borrado de este puntero, pues el compilador se encarga de esto. Informática II 2009/2

Uso de punteros constantes const int * pUno; // El valor al que apunta pUno //no puede ser modificado int * const pDos; // El valor de dirección no // puede ser modificada const int * const pTres; // ni el valor de la // dirección, ni el valor al que apunta // pTres puede ser modificado Informática II 2009/2

Uso de punteros constantes Cuando un puntero es declarado para que apunte a un objeto constante, solo podrá acceder a los métodos constantes de dicho objeto. El puntero this de un objeto constante solo podrá ser usado con métodos constantes. Informática II 2009/2

Zona de Preguntas Cómo se declara un puntero? Para que son útiles los punteros? Que es el heap o free store? Cómo se reserva memoria en el heap? Mencione 2 caracteristicas del heap Que pasa en el código mostrado? #include <iostream> double *ptr; //el puntero se declara como global int main() { for(;;){ //bucle infinito ptr=new double; //se pide espacio en la memoria dinámica } return 0; Informática II 2009/2

Resumen de apuntadores Expresión Lectura *x Apuntado por x &x Dirección de x x.y Miembro y del objeto x x->y Miembro y del objeto apuntado por x (*x).y x[0] Primer objeto apuntado por x x[1] Segundo objeto apuntado por x x[n+1] Objeto (n+1) apuntado por x Informática II 2009/2

GRACIAS POR SU ATENCIÓN Informática II 2009/2

Bibliografía man, ¡no dude en utilizarlo!! Como Programar en C++ - Deithel & Deithel Ed. PRENTICE HALL Sams Teach Yourself C++ in One Hour a Day, J. Liberty,S. Rao, B. Jones http://newdata.box.sk/bx/c/ Informática II 2011/2

Gracias ! Informática II 2009/2