MEMORIA DINÁMICA: PUNTEROSjvalvarez/docencia/pII antiguo/tema2.pdf · MEMORIA DINÁMICA y PUNTEROS...

31
TEMA 2: MEMORIA DINÁMICA y PUNTEROS Departamento de Informática Universidad de Valladolid Campus de Segovia ______________________ Prof. José Vicente Álvarez Bravo

Transcript of MEMORIA DINÁMICA: PUNTEROSjvalvarez/docencia/pII antiguo/tema2.pdf · MEMORIA DINÁMICA y PUNTEROS...

Page 1: MEMORIA DINÁMICA: PUNTEROSjvalvarez/docencia/pII antiguo/tema2.pdf · MEMORIA DINÁMICA y PUNTEROS •Introducción •Conceptos básicos •Definición y declaración de punteros

TEMA 2:MEMORIA DINÁMICA

yPUNTEROS

Departamento de InformáticaUniversidad de Valladolid

Campus de Segovia______________________

Prof. José Vicente Álvarez Bravo

Page 2: MEMORIA DINÁMICA: PUNTEROSjvalvarez/docencia/pII antiguo/tema2.pdf · MEMORIA DINÁMICA y PUNTEROS •Introducción •Conceptos básicos •Definición y declaración de punteros

MEMORIA DINÁMICA yPUNTEROS

•Introducción•Conceptos básicos•Definición y declaración de punteros•Creación y destrucción de variablesdinámicas.•Operaciones básicas con datosreferenciados•Operaciones básicas con punteros•El valor nil•Aplicaciones no recursivas de lospunteros

Page 3: MEMORIA DINÁMICA: PUNTEROSjvalvarez/docencia/pII antiguo/tema2.pdf · MEMORIA DINÁMICA y PUNTEROS •Introducción •Conceptos básicos •Definición y declaración de punteros

INTRODUCCIÓN

• Las estructuras de datos hasta ahora vistasse almacenan estáticamente en la memoriafísica del ordenador.

– El espacio de memoria se reserva con anticipación yno cambia durante la ejecución del programa*.

– Esto permite una comprobación de tipos en tiempode compilación.

• Inconvenientes de la configuraciónestática:

– Su rigidez, ya que estas estructuras no puedencrecer o menguar durante la ejecución delprograma.

* Esto no implica que la cantidad de memoria de ejecución de un programa seaconstante, ya que dependerá del numero de subprogramas recursivos invocadospor el programa.

Page 4: MEMORIA DINÁMICA: PUNTEROSjvalvarez/docencia/pII antiguo/tema2.pdf · MEMORIA DINÁMICA y PUNTEROS •Introducción •Conceptos básicos •Definición y declaración de punteros

INTRODUCCIÓN

• La definición y manipulación de estosobjetos se realiza en Pascal mediante lospunteros (variables cuyo contenido sonposiciones de memoria).

• Ventaja frente a las estructuras estática:– La flexibilidad que poseen las estructuras

dinámicas en cuanto a las formas que puedenadoptar: árboles, listas, redes, etc...

• Inconvenientes:– Alliasing: Doble direccionamiento sobre una

misma variable lo que implica efectos laterales.

– Gestión de la memoria: Su uso requiere unaespecial atención de la memoria disponible asícomo de la que ya no queramos utilizar.

Page 5: MEMORIA DINÁMICA: PUNTEROSjvalvarez/docencia/pII antiguo/tema2.pdf · MEMORIA DINÁMICA y PUNTEROS •Introducción •Conceptos básicos •Definición y declaración de punteros

CONCEPTOS BÁSICOS

• Un puntero es una variable que contienela dirección de memoria donde seencuentra almacenado un dato.

• Una variable referenciada o datoapuntado es el dato cuya posición enmemoria está contenida en un determinadopuntero (variable dinámica).

DATO

1365 20560123 4567

1365 2056

Dirección de memoria Memoria

puntero

Variablereferenciada

Page 6: MEMORIA DINÁMICA: PUNTEROSjvalvarez/docencia/pII antiguo/tema2.pdf · MEMORIA DINÁMICA y PUNTEROS •Introducción •Conceptos básicos •Definición y declaración de punteros

REPRESENTACIÓN GRÁFICA

DATO

VariablereferenciadaPuntero

Page 7: MEMORIA DINÁMICA: PUNTEROSjvalvarez/docencia/pII antiguo/tema2.pdf · MEMORIA DINÁMICA y PUNTEROS •Introducción •Conceptos básicos •Definición y declaración de punteros

DEFINICIÓN YDECLARACIÓN DE

PUNTEROS

• Para poder usar una variable puntero esnecesario:

– Definir el tipo de dato (o estructura) al que seapunta. (esta declaración se realiza dentro dela sección TYPE).

– Declarar las variables punteros que seannecesarias (esta declaración se realiza dentrode la sección VAR).

– En Pascal un puntero sólo puede señalara objetos de un mismo tipo, elestablecido en la declaración.

Page 8: MEMORIA DINÁMICA: PUNTEROSjvalvarez/docencia/pII antiguo/tema2.pdf · MEMORIA DINÁMICA y PUNTEROS •Introducción •Conceptos básicos •Definición y declaración de punteros

DIAGRAMA SINTÁCTICO

TIPO^

Ejemplo I:

TYPEtapunchar=^char;

VARapcar:=tapunchar;

Ejemplo II:

TYPEtApNodo=^tNodo;tNodo=record

info:.......Sig:tApNodo

end;VAR

ApNodo:=tApNodo;

Page 9: MEMORIA DINÁMICA: PUNTEROSjvalvarez/docencia/pII antiguo/tema2.pdf · MEMORIA DINÁMICA y PUNTEROS •Introducción •Conceptos básicos •Definición y declaración de punteros

ALGUNAS OBSERVACIONESAL RESPECTO

• Una variable de tipo puntero ocupa unacantidad de memoria fija, independientedel tipo de dato al que apunta.

• Un dato referenciado, como el del ejemplo,no posee existencia inicial, o lo que es lomismo no existe inicialmente espacioreservado en memoria para el.

Page 10: MEMORIA DINÁMICA: PUNTEROSjvalvarez/docencia/pII antiguo/tema2.pdf · MEMORIA DINÁMICA y PUNTEROS •Introducción •Conceptos básicos •Definición y declaración de punteros

LA NECESIDAD DE UTILIZARPUNTEROS

• Para poder emplear variables dinámicas esnecesario emplear un tipo de dato quepermita referenciar nuevas posiciones dememoria que no han sido declaradas apriori y que se van a crear y destruir entiempo de ejecución.

• Estas variables son los punteros que enPascal es un tipo de dato simple.

Page 11: MEMORIA DINÁMICA: PUNTEROSjvalvarez/docencia/pII antiguo/tema2.pdf · MEMORIA DINÁMICA y PUNTEROS •Introducción •Conceptos básicos •Definición y declaración de punteros

CREACIÓN Y DESTRUCCIÓNDE VARIABLES DINÁMICAS

• Las variables dinámicas son por definiciónaquellas que se crean cuando se necesitan yse destruyen cuando ya han cumplido consu cometido.

• En pascal la creación y destrucción devariables dinámicas se realiza mediante lossiguientes procedimientos:

– New(puntero)

– Dispose(puntero)

Page 12: MEMORIA DINÁMICA: PUNTEROSjvalvarez/docencia/pII antiguo/tema2.pdf · MEMORIA DINÁMICA y PUNTEROS •Introducción •Conceptos básicos •Definición y declaración de punteros

CREACIÓN DE UNAVARIABLE DINÁMICA

• New(puntero)

– Reserva la memoria necesaria para un dato deltipo apropiado.

– Coloca la dirección de memoria de esta nuevavariable en el puntero.

• Gráficamente esto se representa:

???????

Page 13: MEMORIA DINÁMICA: PUNTEROSjvalvarez/docencia/pII antiguo/tema2.pdf · MEMORIA DINÁMICA y PUNTEROS •Introducción •Conceptos básicos •Definición y declaración de punteros

DESTRUCCIÓN DE UNAVARIABLE DINÁMICA

• Dispose(puntero)

– Libera la memoria asociada a la variablereferida (dejándola libre para otros fines).

– Deja indefinido el valor del puntero.

• Gráficamente esto se representa:

?????????

Page 14: MEMORIA DINÁMICA: PUNTEROSjvalvarez/docencia/pII antiguo/tema2.pdf · MEMORIA DINÁMICA y PUNTEROS •Introducción •Conceptos básicos •Definición y declaración de punteros

OPERACIONES BÁSICAS CONVARIABLES

REFERENCIADAS

• El contenido de la variable referenciadapor el puntero se denota:

puntero^

• Las operaciones permitidas para esta nuevavariables son:

– Asignación– Lectura– Escritura– Todas las operaciones legales que se puedan

realizar con dicho tipo.

Page 15: MEMORIA DINÁMICA: PUNTEROSjvalvarez/docencia/pII antiguo/tema2.pdf · MEMORIA DINÁMICA y PUNTEROS •Introducción •Conceptos básicos •Definición y declaración de punteros

EJEMPLO I...........TYPE

tApcar=^char;VAR

Apcar:tApcar;

BEGIN.........New(Apcar);Readln(Apcar^); {Por ejemplo ‘B’}Apcar^:=Pred(Apcar^);Writeln(Apcar^);..........END.

‘A’

Apcar

Apcar^

Page 16: MEMORIA DINÁMICA: PUNTEROSjvalvarez/docencia/pII antiguo/tema2.pdf · MEMORIA DINÁMICA y PUNTEROS •Introducción •Conceptos básicos •Definición y declaración de punteros

EJEMPLO II...........TYPE

tApnum=^integer;VAR

Apnum1, Apnum2:tApnum;BEGIN.........New(Apnum1); New(Apnum2);Apnum1^:=2; Apnum2^:=4;Apnum2^:=Apnum1^+Apnum2^;Apnum1^:=Apnum2^ DIV 2;..........END.

3

Apnum1

6

Apnum2

Page 17: MEMORIA DINÁMICA: PUNTEROSjvalvarez/docencia/pII antiguo/tema2.pdf · MEMORIA DINÁMICA y PUNTEROS •Introducción •Conceptos básicos •Definición y declaración de punteros

EJEMPLO III

...........TYPE

tVector10=array[1..10] of real;tApnumero=^integer;tApvector=^tvector10;

VARApnum1, Apnum2: tApnum;Apvect: tApvector10;i: integer;

BEGIN.........

New(Apnum1); New(Apnum2); New(apvect);Apnum1^:=45; Apnum2^:=30;Apvect^[1]=2;for i:=2 to 10 do

Apvect^[i]:=Apvect^[i-1] * 2;..........END.

Page 18: MEMORIA DINÁMICA: PUNTEROSjvalvarez/docencia/pII antiguo/tema2.pdf · MEMORIA DINÁMICA y PUNTEROS •Introducción •Conceptos básicos •Definición y declaración de punteros

EJEMPLO III

• Dejando el estado de la memoria de lasiguiente forma:

3

Apnum1

6

Apnum2

2,0

Apvect

4,0 1024,0

Page 19: MEMORIA DINÁMICA: PUNTEROSjvalvarez/docencia/pII antiguo/tema2.pdf · MEMORIA DINÁMICA y PUNTEROS •Introducción •Conceptos básicos •Definición y declaración de punteros

OPERACIONES BÁSICAS CONPUNTEROS

• Las únicas operaciones válidas son:

– La comparación (se comparan las direcciones,no los contenidos de los datos apuntados).

Apnum1=Apnum2

– La asignación (se asignan las direcciones entresí, no los contenidos de los datos apuntados).

Apnum1:=Apnum2

Page 20: MEMORIA DINÁMICA: PUNTEROSjvalvarez/docencia/pII antiguo/tema2.pdf · MEMORIA DINÁMICA y PUNTEROS •Introducción •Conceptos básicos •Definición y declaración de punteros

LA COMPARACIÓN

• Apnum1=Apnum2

• La comparación anterior daría comoresultado el valor ‘false’ ya que cada unoapunta a una dirección de memoriadiferente.

3

Apnum1

3

Apnum2

Page 21: MEMORIA DINÁMICA: PUNTEROSjvalvarez/docencia/pII antiguo/tema2.pdf · MEMORIA DINÁMICA y PUNTEROS •Introducción •Conceptos básicos •Definición y declaración de punteros

LA ASIGNACIÓN

• Apnum1:=Apnum2

3

Apnum1

5

Apnum2

3

Apnum1

5

Apnum2

Page 22: MEMORIA DINÁMICA: PUNTEROSjvalvarez/docencia/pII antiguo/tema2.pdf · MEMORIA DINÁMICA y PUNTEROS •Introducción •Conceptos básicos •Definición y declaración de punteros

LA ASIGNACIÓN

• Los cambios efectuados sobre Apnum1afectan a la variable Apnum2 (sonindistintas) (Alliasing).

• El espacio de memoria reservadoinicialmente por el puntero Apnum1 siguesituado en memoria. Una adecuada gestiónde la memoria hubiera exigido laliberación de ese espacio antes de efectuarla asignación.

3

Apnum1

5

Apnum2

Page 23: MEMORIA DINÁMICA: PUNTEROSjvalvarez/docencia/pII antiguo/tema2.pdf · MEMORIA DINÁMICA y PUNTEROS •Introducción •Conceptos básicos •Definición y declaración de punteros

CONSISTENCIA ENTRE TIPOS

• Operaciones válidas

– Apnum1:=Apnum1– Apnum1=Apnum2– Apvector1:=Apvector2

• Operaciones no válidas:

– Apnum1:=Apchar;– Apnum1=Apvector;

Page 24: MEMORIA DINÁMICA: PUNTEROSjvalvarez/docencia/pII antiguo/tema2.pdf · MEMORIA DINÁMICA y PUNTEROS •Introducción •Conceptos básicos •Definición y declaración de punteros

EL VALOR NIL

• Un modo alternativo de asignar un valor aun puntero es indicar que no apunta aningún dato. Esto se lleva a cabo mediantela constante predefinida “nil”

• “nil” es independiente del tipo del datoapuntado por lo que puede ser utilizado porcualquier puntero.

– Apcar:=nil;– Apcar=nil;

• Representación gráfica:

Page 25: MEMORIA DINÁMICA: PUNTEROSjvalvarez/docencia/pII antiguo/tema2.pdf · MEMORIA DINÁMICA y PUNTEROS •Introducción •Conceptos básicos •Definición y declaración de punteros

APLICACIONES NORECURSIVAS CON

PUNTEROS

• Asignación de objetos no simples en unsolo paso

• Definición de funciones cuyo resultado noes simple

Page 26: MEMORIA DINÁMICA: PUNTEROSjvalvarez/docencia/pII antiguo/tema2.pdf · MEMORIA DINÁMICA y PUNTEROS •Introducción •Conceptos básicos •Definición y declaración de punteros

ASIGNACIÓN DE OBJETOSNO SIMPLES

• Esta aplicación es de utilidad cuando semanejan variables o estructuras de datos degran tamaño (por el elevado coste quesupone el realizar la copia de todas suscomponentes).

– Asignación de variables de gran tamaño

– Ordenación de vectores con elementos de grantamaño.

Page 27: MEMORIA DINÁMICA: PUNTEROSjvalvarez/docencia/pII antiguo/tema2.pdf · MEMORIA DINÁMICA y PUNTEROS •Introducción •Conceptos básicos •Definición y declaración de punteros

EJEMPLO IASIGNACIÓN DE VARIABLES DE GRAN

TAMAÑO

TYPEtFicha=record

nombre:string;direccion:string;..............

End; {tFicha}

VARpers1,pers2:tFicha;

BEGIN....................Pers1:=pers2; {operación muy costosa en

espacio y tiempo}....................

Page 28: MEMORIA DINÁMICA: PUNTEROSjvalvarez/docencia/pII antiguo/tema2.pdf · MEMORIA DINÁMICA y PUNTEROS •Introducción •Conceptos básicos •Definición y declaración de punteros

SOLUCIÓN AL EJEMPLO I

TYPEtApficha=^tFicha;tFicha=record

nombre:string;direccion:string;..............

End; {tFicha}

VARp1,p2:tApficha;

BEGIN....................p1:=p2; {asignación instantánea}....................

Page 29: MEMORIA DINÁMICA: PUNTEROSjvalvarez/docencia/pII antiguo/tema2.pdf · MEMORIA DINÁMICA y PUNTEROS •Introducción •Conceptos básicos •Definición y declaración de punteros

EJEMPLO IIORDENACIÓN DE VECTORES CONELEMENTOS DE GRAN TAMAÑO

TYPEtApFicha=^tFicha;tFicha=record

nombre:string;direccion:string;..............

End; {tFicha}{tListaAlumnos=Array[1..100] of tFicha;}tlistaApAlum=array[1..100] of tApFicha;.............

• Las operaciones de ordenación y búsquedase realizan sobre el array de punteros.

Page 30: MEMORIA DINÁMICA: PUNTEROSjvalvarez/docencia/pII antiguo/tema2.pdf · MEMORIA DINÁMICA y PUNTEROS •Introducción •Conceptos básicos •Definición y declaración de punteros

FUNCIONES DE RESULTADONO SIMPLE

• Como en el caso anterior se cambia elobjeto por el puntero que lo apunta.

• Ejemplo: Definir un subprograma que apartir de un punto del plano, un ángulo yuna distancia calcule la posición de unnuevo punto.

Page 31: MEMORIA DINÁMICA: PUNTEROSjvalvarez/docencia/pII antiguo/tema2.pdf · MEMORIA DINÁMICA y PUNTEROS •Introducción •Conceptos básicos •Definición y declaración de punteros

FUNCIONES DE RESULTADONO SIMPLE, EJEMPLO

........TYPE

tPunto=recordx,y:real;

end; {tPunto}tApPunto=^tPunto;

VARangulo,distancia:real;origen:tPunto;pDestino:tApPunto;

..........FUNCTION Destino(orig:tPunto;ang,dist:real):tApPuntoVAR

pPun:tApPunto;Begin

New(pPun);pPun^.x:=orig.x+dist*cos(ang);pPun^.y:=orig.y+dist*sen(ang):destino:=pPun;

End; {Destino}