Está en la página 1de 18

Tema 6

Organizacin
de la memoria
Memoria esttica
Memoria dinmica

Punteros
Tema 6: Memoria dinmica
Definicin y
declaracin Programacin 2
Direccin y
contenido
Declaracin con
inicializacin
Ejercicios

Uso de
punteros
Reserva y liberacin
de memoria
Punteros y vectores
Punteros definidos
Curso 2013-2014
con typedef
Punteros y registros
Parmetros de
funciones
Errores comunes
Ejercicios
ndice

Tema 6 1 Organizacin de la memoria


Memoria esttica
Organizacin
Memoria dinmica
de la memoria
Memoria esttica
2 Punteros
Memoria dinmica Definicin y declaracin
Punteros
Definicin y
Direccin y contenido
declaracin
Direccin y
Declaracin con inicializacin
contenido
Declaracin con
inicializacin
Ejercicios
Ejercicios 3 Uso de punteros
Uso de
punteros Reserva y liberacin de memoria
Reserva y liberacin
de memoria Punteros y vectores
Punteros y vectores
Punteros definidos Punteros definidos con typedef
con typedef
Punteros y registros Punteros y registros
Parmetros de
funciones
Errores comunes
Parmetros de funciones
Ejercicios Errores comunes
Ejercicios
Memoria esttica

Tema 6

Organizacin
de la memoria El tamao es fijo y se conoce al implementar el
Memoria esttica
Memoria dinmica programa
Punteros
Definicin y
Declaracin de variables
declaracin
Direccin y
contenido
int i=0;
Declaracin con char c;
inicializacin
Ejercicios float vf[3]={1.0, 2.0, 3.0};
Uso de
punteros
Reserva y liberacin
de memoria
i c vf[0] vf[1] vf[2]
Punteros y vectores 0 1.0 2.0 3.0
Punteros definidos
con typedef 1000 1002 1004 1006 1008
Punteros y registros
Parmetros de
funciones
Errores comunes
Ejercicios
Memoria dinmica

Tema 6

Organizacin
de la memoria
Memoria esttica
Memoria dinmica Normalmente se utiliza para almacenar grandes
Punteros volmenes de datos, cuya cantidad exacta se
Definicin y
declaracin desconoce al implementar el programa
Direccin y
contenido
Declaracin con La cantidad de datos a almacenar se calcula durante la
inicializacin
Ejercicios ejecucin del programa y puede cambiar
Uso de
punteros En C++ se puede hacer uso de la memoria dinmica
Reserva y liberacin
de memoria usando punteros
Punteros y vectores
Punteros definidos
con typedef
Punteros y registros
Parmetros de
funciones
Errores comunes
Ejercicios
Definicin y declaracin

Tema 6

Organizacin Un puntero es un nmero (entero largo) que se


de la memoria
Memoria esttica corresponde con una direccin de memoria
Memoria dinmica

Punteros
En la declaracin de un puntero, se debe especificar el
Definicin y
declaracin tipo de dato que contiene la direccin de memoria
Direccin y
contenido
Declaracin con
Se declaran usando el carcter *
inicializacin
Ejercicios Ejemplos:
Uso de
punteros int *punteroAEntero;
Reserva y liberacin
de memoria
char *punteroAChar;
Punteros y vectores int *VectorPunterosAEntero[tVECTOR];
Punteros definidos
con typedef double **punteroAPunteroAReal;
Punteros y registros
Parmetros de
funciones
Errores comunes
Ejercicios
Direccin y contenido

Tema 6

Organizacin *x Contenido de la direccin apuntada por x


de la memoria
Memoria esttica
&x Direccin de memoria de la variable x
Memoria dinmica

Punteros
Definicin y
declaracin
Ejemplo:
Direccin y
contenido
Declaracin con int i=3;
inicializacin
int *pi;
Ejercicios
pi=&i; // pi=direccion de memoria de i
Uso de
punteros *pi = 11; // contenido de pi=11. Por lo tanto, i = 11
Reserva y liberacin
de memoria
Punteros y vectores
Punteros definidos i pi
con typedef
Punteros y registros 11 1000
Parmetros de
funciones
1000 1002 1004 1006 1008
Errores comunes
Ejercicios
Declaracin con inicializacin

Tema 6

Organizacin
de la memoria Declaracin con inicializacin:
Memoria esttica
Memoria dinmica
int *pi=&i; // pi contiene la direccion de i
Punteros
Definicin y
declaracin
Direccin y
contenido
El puntero NULL es aquel que no apunta a ninguna
Declaracin con
inicializacin
variable
Ejercicios

Uso de
int *pi=NULL;
punteros
Reserva y liberacin
de memoria
Punteros y vectores
Precaucin: siempre que un puntero no tenga memoria
Punteros definidos
con typedef
asignada debe valer NULL.
Punteros y registros
Parmetros de
funciones
Errores comunes
Ejercicios
Ejercicios

Tema 6
Ejercicio 1
Indica cul sera la salida de los siguientes fragmentos de
Organizacin
de la memoria cdigo:
Memoria esttica
Memoria dinmica
int e1;
Punteros int *p1, *p2;
Definicin y
declaracin e1 = 7;
Direccin y
contenido
p1 = &e1;
Declaracin con p2 = p1;
inicializacin
Ejercicios
e1++;
(*p2) += e1;
Uso de
punteros cout << *p1;
Reserva y liberacin
de memoria
Punteros y vectores
Punteros definidos
con typedef
int a=7;
Punteros y registros int *p=&a;
Parmetros de
funciones
int **pp=&p;
Errores comunes cout << **pp;
Ejercicios
Reserva y liberacin de memoria (1/2)

Tema 6

Los punteros pueden usarse para reservar (con new) o


Organizacin liberar (con delete) memoria dinmica
de la memoria
Memoria esttica
Memoria dinmica
Ejemplo:
Punteros double *pd;
Definicin y
declaracin pd = new double; // reserva memoria
Direccin y
contenido *pd = 4.75;
Declaracin con cout << *pd << endl; // muestra 4.75
inicializacin
Ejercicios delete pd; // libera memoria
Uso de
punteros
Reserva y liberacin
de memoria
pd
Punteros y vectores 2000 4.75
Punteros definidos
con typedef 1000 1002 ... 2000 2002
Punteros y registros
Parmetros de
funciones Ojo: Las variables locales y las reservadas con new
Errores comunes
Ejercicios van a zonas de memoria distintas.
Reserva y liberacin de memoria (2/2)

Tema 6

Organizacin
Cuando se usa new, el compilador reserva memoria y
de la memoria devuelve la direccin de inicio de ese espacio
Memoria esttica
Memoria dinmica reservado
Punteros
Definicin y Si no hay suficiente memoria para la reserva, new
declaracin
Direccin y
contenido
devuelve NULL
Declaracin con
inicializacin Siempre que se reserva memoria con new hay que
Ejercicios

Uso de
liberarla con delete
punteros
Reserva y liberacin
Ojo: Tras hacer delete, el puntero no vale NULL por
de memoria
Punteros y vectores defecto
Punteros definidos
con typedef
Punteros y registros
Un puntero se puede reutilizar; tras liberar su contenido
Parmetros de
funciones se puede reservar memoria otra vez con new
Errores comunes
Ejercicios
Punteros y vectores (1/2)

Tema 6

Los punteros tambin pueden usarse para crear


Organizacin
de la memoria vectores o matrices
Memoria esttica
Memoria dinmica Para reservar memoria hay que usar corchetes y
Punteros especificar el tamao
Definicin y
declaracin
Direccin y Para liberar toda la memoria reservada es necesario
contenido
Declaracin con
inicializacin
usar corchetes
Ejercicios
Ejemplo:
Uso de
punteros
Reserva y liberacin
int *pv;
de memoria
int n=10;
Punteros y vectores
Punteros definidos pv=new int[n]; // reserva memoria para n enteros
con typedef
pv[0]=585; // usamos el puntero como si fuera un vector
Punteros y registros
Parmetros de delete [] pv; // liberar la memoria reservada
funciones
Errores comunes
Ejercicios
Punteros y vectores (2/2)

Tema 6

Organizacin
de la memoria
Memoria esttica
Memoria dinmica
Los punteros se pueden usar como accesos directos a
Punteros componentes de vectores o matrices
Definicin y
declaracin
Direccin y
Ejemplo:
contenido
Declaracin con
inicializacin int v[tVECTOR];
Ejercicios int *pv;
Uso de pv = &(v[7]);
punteros *pv = 117; // v[7] = 117;
Reserva y liberacin
de memoria
Punteros y vectores
Punteros definidos
con typedef
Punteros y registros
Parmetros de
funciones
Errores comunes
Ejercicios
Punteros definidos con typedef

Tema 6

Organizacin Se pueden definir nuevos tipos de datos con typedef:


de la memoria
Memoria esttica
Memoria dinmica
typedef int entero; // entero es un tipo, como int
entero a,b; // int a,b;
Punteros
Definicin y
declaracin
Direccin y
contenido
Para facilitar la claridad en el cdigo, suelen definirse
Declaracin con
inicializacin los punteros con typedef:
Ejercicios

Uso de typedef int *punteroAEntero;


punteros typedef struct {
Reserva y liberacin
de memoria char c;
Punteros y vectores int i;
Punteros definidos
con typedef } Registro, *PunteroRegistro;
Punteros y registros
Parmetros de
funciones
Errores comunes
Ejercicios
Punteros y registros

Tema 6

Organizacin
de la memoria Cuando un puntero referencia a un registro, se puede
Memoria esttica
Memoria dinmica usar el operador -> para acceder a sus campos
Punteros
Definicin y
declaracin
typedef struct {
Direccin y
contenido char c;
Declaracin con
inicializacin int i;
Ejercicios } Registro, *PunteroRegistro;
Uso de
punteros PunteroRegistro pr;
Reserva y liberacin
de memoria
pr = new Registro;
Punteros y vectores pr->c = a; // (*pr).c = a;
Punteros definidos
con typedef
Punteros y registros
Parmetros de
funciones
Errores comunes
Ejercicios
Parmetros de funciones (1/2)

Tema 6

Paso de parmetros a funciones


Organizacin
de la memoria
Memoria esttica void f (int *p) { // Por valor
Memoria dinmica
*p=2;
Punteros }
Definicin y
declaracin
Direccin y void f2 (int *&p) { // Por referencia
contenido
Declaracin con
int num=10;
inicializacin p=&num;
Ejercicios
}
Uso de
punteros
Reserva y liberacin
int main() {
de memoria int i=0;
Punteros y vectores
Punteros definidos
int *p=&i;
con typedef f(p); // Llamada a funciones
Punteros y registros
Parmetros de
f2(p);
funciones }
Errores comunes
Ejercicios
Parmetros de funciones (2/2)

Tema 6
Paso de parmetros a funciones usando typedef

Organizacin
de la memoria typedef int* PInt;
Memoria esttica
Memoria dinmica
void f (PInt p){ // Por valor
Punteros *p=2;
Definicin y
declaracin }
Direccin y
contenido
Declaracin con void f2 (PInt &p) { // Por referencia
inicializacin
Ejercicios
int num=10;
p=&num;
Uso de
punteros
}
Reserva y liberacin
de memoria
Punteros y vectores
int main() {
Punteros definidos int i=0;
con typedef
Punteros y registros
PInt p=&i;
Parmetros de f(p); // Llamada a funciones
funciones
Errores comunes
f2(p);
Ejercicios }
Errores comunes

Tema 6
Utilizar un puntero sin haberle asignado memoria o
apuntando a nada
Organizacin
de la memoria int *pEntero;
Memoria esttica
Memoria dinmica
*pEntero = 7; // Error !!!
Punteros
Definicin y
declaracin
Usar un puntero tras haberlo liberado
Direccin y
contenido
Declaracin con
punteroREGISTRO p,q;
inicializacin p = new REGISTRO;
Ejercicios
...
Uso de q = p;
punteros
delete p;
Reserva y liberacin
de memoria q->num =7; // Error !!!
Punteros y vectores
Punteros definidos
con typedef
Punteros y registros Liberar memoria no reservada
Parmetros de
funciones
Errores comunes int *p=&i;
Ejercicios delete p;
Ejercicios

Tema 6

Organizacin Ejercicio 2
de la memoria
Memoria esttica
Memoria dinmica
Dado el siguiente registro:
Punteros
Definicin y
typedef struct {
declaracin
char nombre[32];
Direccin y
contenido int edad;
Declaracin con
inicializacin
} Cliente;
Ejercicios

Uso de Realizar un programa que lea un cliente (slo uno) de


punteros
Reserva y liberacin
de memoria
un fichero binario, lo almacene en memoria dinmica
Punteros y vectores
Punteros definidos
usando un puntero, imprima su contenido y finalmente
con typedef
Punteros y registros
libere la memoria reservada.
Parmetros de
funciones
Errores comunes
Ejercicios

También podría gustarte