Sie sind auf Seite 1von 29

Intensivo 2015

Programacin No
Numrica I
MSc. Ing. Mara Auxiliadora Prez

Unidad II
Memoria
Dinmica

Cuando una variable se declara, se asocian


tres atributos fundamentales con la misma: su
nombre, su tipo y su direccin de memoria.
Ejemplo:
int x;
0x22ff74
x
int
3

#include <iostream>
using namespace std;

int main()
{
int x;
x = 25;
// acceso a la variable a travs de su nombre
cout << "Valor de x : " << x << endl;
// acceso a la variable a travs del operador de direccin
&

cout << "x esta en la direccion : " << &x <<


endl;
system("PAUSE");
return EXIT_SUCCESS;
}

Una referencia es un alias a una variable. Se


declara utilizando el operador de referencia &
que se aade al tipo de la referencia
int main() {
int x = 25;
int& y = x;
cout << "Valor de x : " << x << endl;
cout << "Valor de y : " << y << endl;
// x <y> y son nombres diferentes para la misma variable
system("PAUSE");
return 0;
}
6

Una variable que puede almacenar una


direccin de memoria se llama puntero.
Una variable de tipo puntero puede guardar
direcciones de variables de un tipo
determinado: punteros a int, double, char, etc.

Un apuntador, es una variable esttica cuyo valor es la direccin


de una posicin de memoria.
Es una referencia indirecta a un elemento.
Direccin
1350

Valor
1592
.
.
.

Punteros

1592

A
.
.
.

1614

1690
.
.
.

1690

15

tipo *nombre_variable;
int i=3, *p,*r;
// p y r son punteros a entero
double d=3.3,*q;
// q es un puntero a double
char* c='a', *t;// t es un puntero a carcter

p=&i;
r=p;
p = q; ERROR
10

cin>>*p;
if (p==r)
cout<<"El valor de i es: "<<*p;
*p=*p+3;
p=p+3;

11

Es posible mostrar una direccin como valor de


una variable de tipo puntero, o la direccin de
cualquier variable, en la pantalla utilizando un
cout.

cout << p = << p << endl;


cout << &n = << &n << endl;
cout << &p= << &p << endl;
12

1. int *p, *q, a=5


p

a:

p
q

8
?

4. q=p;
p

3. *p=8;
a:

a:

2. p=&a

5. *q=85;

a:
8

a:

85

q
13

6. a=33;

. 7. int b=1;
a:

33

a:
b
:

33
1

. 8. q=&b;
p

a:

b:

33

NOTA
a,b,p,q : variables locales automticas

14

int main()
{ int x, y, *p, *q;
p = &x;
*p = 5;
q = &y;
*q = 23;
cout << *p << " << *q << endl;
q = p;
*p = 35;
cout << *p << " << *q << endl;
q = NULL;
cout << x << " << y << endl;
system(PAUSE);
return 0;
}

15

int main()
{
int *p, *q, x, y;
p = &x;
*p = 14;
q = p;
cout << *p << " " << *q << endl;
q = NULL;
cout << x << " << y << endl;
system(PAUSE);
return 0;

16

int main()
{ int x, y, *p, *q;
p = &x;
*p = 12;
q = &y;
*q = 23;
cout << *p <<" "<<*q<<endl;
*p = *q;
cout << *p <<" "<<*q<<endl;
q = NULL;
cout<<*p<<endl;
cout<<x<<" "<<y<<endl;
system(PAUSE);
return 0;
}

17

int main()
{ int x, y, *p, *q;
p = &x;
*p = 14;
q = p;
if ( p == q)
q = &y;
if ( p == q)
*q = 14;
if (p == q)
if (*p == *q)
system(PAUSE);
return 0;
}

cout<<"Mensaje 1";

cout<<"Mensaje 2";
cout<<"Mensaje 3";
cout<<"Mensaje 4";

18

El espacio que ocupan en memoria se


define en tiempo de ejecucin, su ubicacin
puede variar y pueden ser creadas, crecer
y destruirse de acuerdo a las necesidades
del programa.

La definicin de estructuras dinmicas


requieren el uso de Apuntadores donde
se almacena las direcciones de memoria
real.

int *p;
p = new int;
:::
delete p;
int q=new int(3);
float t=new float(2,2);
:::
delete q;
20

1. int *p, *q;


p
q

2. p=new int;
p

4. q=p;
p
q

3. *p=10;
?

p
q

10
?

5. *q=85;
10

85

q
21

5. *q=85;
p

. 6. p = new ( int);
p

85

q
85

. 7. *p= 9;
p

q
85

22

85

q
85

8. delete p, q;
p
q

?
?

9. delete q;
p
q

?
23

CREACION: Funcin new

Permite inicializar el puntero. Esta funcin asigna un espacio en memoria


al tipo de datos apuntado por el puntero, para que pueda ser utilizado.
variable_puntero= new tipo_dato;
apuntador=new int;

Se crea una variable dinmica en memoria y le asigna a apuntador la


direccin de esa variable

Para referirnos a la variable dinmica creada se hace con el smbolo *.


Entonces la nueva variable creada es : *apuntador

Al ejecutar la instruccin
apuntador=new int;

debe existir suficiente espacio de


memoria libre en el montculo
(heap) el cual es la pila de variables
dinmicas.
Ejemplo:
char *aux1,*aux2;
...
aux1 = new char;
aux2 = new char;
*aux1='A';
aux2=aux1;
*aux1='B';
cout << "*Aux1 = " << *aux1 << " y *Aux2= " << *aux2 << endl;

Procedimiento Delete

Permite liberar la posicin de memoria ocupada por la variable dinmica


delete variable_puntero

delete apuntador;

As se destruye la variable apuntada por apuntador y apuntador se vuelve


indefinido. Al hacer referencia a *apuntador se producir un error.

Se utiliza para indicar que una variable tipo puntero tiene como
contenido el valor vaco, es decir, que no apunta a nadie.
Al ejecutar
apuntador1= NULL

apuntador1 no apunta a ninguna posicin vlida de memoria.


Referirse a Apuntador1 sera incorrecto.

Por ejemplo:

apuntador1=NULL
*apuntador1=F Asignacin Incorrecta.

Asignacin:

p= q

Comparacin de igualdad y desigualdad :


== q y p!=q

No se pueden operar aritmticamente

No se imprimen ni leen