PDF de programación - Tema 2: Memoria dinámica y punteros

Imágen de pdf Tema 2: Memoria dinámica y punteros

Tema 2: Memoria dinámica y punterosgráfica de visualizaciones

Publicado el 1 de Junio del 2021
300 visualizaciones desde el 1 de Junio del 2021
79,5 KB
30 paginas
Creado hace 17a (07/03/2007)
Departamento de Informática
Universidad de Valladolid
Campus de Segovia
______________________

TEMA 2:

MEMORIA DINÁMICA y

PUNTEROS

1

MEMORIA DINÁMICA y

PUNTEROS

•Introducción
•Conceptos básicos
•Definición y declaración de punteros
•Creación y destrucción de variables dinámicas.
•Operaciones básicas con datos referenciados
•Operaciones básicas con punteros
•El valor nil
•Aplicaciones no recursivas de los punteros

2

INTRODUCCIÓN

• Las estructuras de datos hasta ahora vistas se almacenan

estáticamente en la memoria física del ordenador.

– El espacio de memoria se reserva con anticipación y no cambia

durante la ejecución del programa*.

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



Inconvenientes de la configuración estática:

– Su rigidez, ya que estas estructuras no pueden crecer o

menguar durante la ejecución del programa.

* Esto no implica que la cantidad de memoria de ejecución de un programa sea constante, ya que

dependerá del numero de subprogramas recursivos invocados por el programa.

3

INTRODUCCIÓN

• La definición y manipulación de estos objetos se realiza en

Pascal mediante los punteros (variables cuyo contenido son
posiciones de memoria).

• Ventaja frente a las estructuras estática:

– La flexibilidad que poseen las estructuras dinámicas en cuanto a

las formas que pueden adoptar: á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 una especial atención de
la memoria disponible así como de la que ya no queramos utilizar.

4

CONCEPTOS BÁSICOS

• Un puntero es una variable que contiene la dirección de

memoria donde se encuentra almacenado un dato.

• Una variable referenciada o dato apuntado es el dato cuya

posición en memoria está contenida en un determinado puntero
(variable dinámica).

Dirección de

memoria
0123 4567

Memoria

1365 2056

1365 2056

DATO

puntero

Variable

referenciada

5

REPRESENTACIÓN GRÁFICA

Puntero

Variable

referenciada

DATO

6

DEFINICIÓN Y DECLARACIÓN DE

PUNTEROS



Para poder usar una variable puntero es necesario:





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

Declarar las variables punteros que sean necesarias (esta
declaración se realiza dentro de la sección VAR).



En Pascal un puntero sólo puede señalar a objetos
de un mismo tipo, el establecido en la declaración.

7

DIAGRAMA SINTÁCTICO

Ejemplo I:

TYPE

VAR

tapunchar=^char;

apcar:=tapunchar;

^

TIPO

Ejemplo II:

TYPE

VAR

tApNodo=^tNodo;
tNodo=record

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

end;

ApNodo:=tApNodo;

8

ALGUNAS OBSERVACIONES AL

RESPECTO

• Una variable de tipo puntero ocupa una cantidad de
memoria fija, independiente del tipo de dato al que
apunta.

• Un dato referenciado, como el del ejemplo, no posee

existencia inicial, o lo que es lo mismo no existe
inicialmente espacio reservado en memoria para el.

9

LA NECESIDAD DE UTILIZAR

PUNTEROS

• Para poder emplear variables dinámicas es

necesario emplear un tipo de dato que permita
referenciar nuevas posiciones de memoria que no
han sido declaradas a priori y que se van a crear y
destruir en tiempo de ejecución.

• Estas variables son los punteros que en Pascal es un

tipo de dato simple.

10

CREACIÓN Y DESTRUCCIÓN DE

VARIABLES DINÁMICAS

• Las variables dinámicas son por definición aquellas
que se crean cuando se necesitan y se destruyen
cuando ya han cumplido con su cometido.

• En pascal la creación y destrucción de variables

dinámicas se realiza mediante los siguientes
procedimientos:

– New(puntero)

– Dispose(puntero)

11

CREACIÓN DE UNA VARIABLE

DINÁMICA

• New(puntero)

– Reserva la memoria necesaria para un dato del tipo

apropiado.

– Coloca la dirección de memoria de esta nueva variable en el

puntero.

• Gráficamente esto se representa:

???????

12

DESTRUCCIÓN DE UNA VARIABLE

DINÁMICA

• Dispose(puntero)

– Libera la memoria asociada a la variable referida (dejándola

libre para otros fines).

– Deja indefinido el valor del puntero.
• Gráficamente esto se representa:

?????????

13

OPERACIONES BÁSICAS CON
VARIABLES REFERENCIADAS

• El contenido de la variable referenciada por el

puntero se denota:

• Las operaciones permitidas para esta nueva

variables son:

puntero^

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

dicho tipo.

14

EJEMPLO I

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

VAR

tApcar=^char;

Apcar:tApcar;

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

Apcar

Apcar^
‘A’

15

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

EJEMPLO II

tApnum=^integer;

VAR

Apnum1, Apnum2:tApnum;

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

Apnum1

Apnum2

3

6

16

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

EJEMPLO III

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

VAR

Apnum1, 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.

17

EJEMPLO III

• Dejando el estado de la memoria de la siguiente

forma:

Apnum1

Apnum2

3

6

Apvect

2,0

4,0

1024,0

18

OPERACIONES BÁSICAS CON

PUNTEROS

• 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 entre sí, no los

contenidos de los datos apuntados).

Apnum1:=Apnum2

19

LA COMPARACIÓN

Apnum1

Apnum2

3

3

• Apnum1=Apnum2

• La comparación anterior daría como resultado el

valor ‘false’ ya que cada uno apunta a una dirección
de memoria diferente.

20

LA ASIGNACIÓN

Apnum1

Apnum2

3

5

• Apnum1:=Apnum2

Apnum1

Apnum2

3

5

21

LA ASIGNACIÓN
Apnum2

Apnum1

3

5

• Los cambios efectuados sobre Apnum1 afectan a la variable

Apnum2 (son indistintas) (Alliasing).

• El espacio de memoria reservado inicialmente por el puntero

Apnum1 sigue situado en memoria. Una adecuada gestión de
la memoria hubiera exigido la liberación de ese espacio antes
de efectuar la asignación.

22

CONSISTENCIA ENTRE TIPOS

• Operaciones válidas

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

• Operaciones no válidas:

– Apnum1:=Apchar;
– Apnum1=Apvector;

23

EL VALOR NIL

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



“nil” es independiente del tipo del dato apuntado por
lo que puede ser utilizado por cualquier puntero.

– Apcar:=nil;
– Apcar=nil;

• Representación gráfica:

24

APLICACIONES NO RECURSIVAS CON

PUNTEROS

• Asignación de datos compuestos en un solo paso

• Definición de funciones que devuelven datos

compuestos.

25

ASIGNACIÓN DE DATOS

COMPUESTOS

• Esta aplicación es de utilidad cuando se manejan
variables o estructuras de datos de gran tamaño
(por el elevado coste que supone el realizar la copia
de todas sus componentes).

– Asignación de variables de gran tamaño

– Ordenación de vectores con elementos de gran tamaño.

26

ORDENACIÓN DE VECTORES CON ELEMENTOS

DE GRAN TAMAÑO

TYPE
tApFicha=^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úsqueda se realizan sobre el

array de punteros.

27

FUNCIONES QUE DEVUELVEN

DATOS COMPUESTOS

• Como en el caso anterior se cambia el objeto por el

puntero que lo apunta.

• Ejemplo: Definir un subprograma que a partir de un
punto del plano, un ángulo y una distancia calcule la
posición de un nuevo punto.

28

FUNCIONES DE RESULTADO NO

SIMPLE, EJEMPLO

........
TYPE

tPunto=record
x,y:real;
end; {tPunto}
tApPunto=^tPunto;

VAR

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

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

29

FUNCIONES DE RESULTADO NO

SIMPLE, EJEMPLO

FUNCTION Destino(orig:tPunto;ang,dist:real):tApPunto
VAR

pPun:tApPunto;

Begin

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

End; {Destino}

30
  • Links de descarga
http://lwp-l.com/pdf19260

Comentarios de: Tema 2: Memoria dinámica y punteros (0)


No hay comentarios
 

Comentar...

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios...
CerrarCerrar
CerrarCerrar
Cerrar

Tienes que ser un usuario registrado para poder insertar imágenes, archivos y/o videos.

Puedes registrarte o validarte desde aquí.

Codigo
Negrita
Subrayado
Tachado
Cursiva
Insertar enlace
Imagen externa
Emoticon
Tabular
Centrar
Titulo
Linea
Disminuir
Aumentar
Vista preliminar
sonreir
dientes
lengua
guiño
enfadado
confundido
llorar
avergonzado
sorprendido
triste
sol
estrella
jarra
camara
taza de cafe
email
beso
bombilla
amor
mal
bien
Es necesario revisar y aceptar las políticas de privacidad