Está en la página 1de 32

Conceptos de Algoritmos Datos y

Programas

1
Clase
Clase 11
9
CADP – Temas de la clase de hoy

Alocación estática y dinámica

Tipo de datos puntero

Ejercicios

Clase 11 2
CADP – Cómo es la memoria de la CPU?

Otros datos

Programas, variables integer,


Memoria char, real, boolean, registro,
Estática arreglos.
Tamaño de la memoria fijo

Memoria
Dinámica

C P U

Clase 3
Clase 11
9
CADP – Cómo es la memoria de la CPU?
Tamaño de las variables:
Char = 1byte
Integer = 4 bytes
Real = 8 bytes
Boolean = 1 byte
String = cantidad de caracteres + 1
Registro = suma de lo que
Memoria ocupa c/ campo
Estática Puntero = 4 bytes
1G = 1073741824 bytes

Memoria
Dinámica

C P U Qué ocurre si declaro un arreglo de


Clase
Clase 11
9
3000000 strings? 4
CADP – Variables estáticas y variables dinámicas

VARIABLES ESTATICAS VARIABLES DINAMICAS

La rigidez ya que no permite que Permite modificar en ejecución


las estructuras varíen su la memoria utilizada.
dimensión.
Las variables y tipos reservan
memoria en su declaración y se
mantienen durante todo el
programa. El lenguaje puede
validar previo a la ejecución
Clase 5
Clase 11
9
CADP – Tipo de dato – Puntero - Definición
Un puntero es un tipo de variable usada
para almacenar la dirección en memoria de
otra variable, en lugar de un dato
convencional. Es un tipo de datos simple.
Puntero
Mediante la variable de tipo
puntero se accede a una
dirección, y en dicha
dirección de memoria se
Memoria num: 536 encuentra realmente el valor
Estática almacenado.
pun: FAFB
Memoria FAFA
Dinámica FAFB
Clase
Clase 11
9
C P U 6
CADP – Tipo de dato – Puntero - Definición
Un puntero es un tipo de variable usada
para almacenar la dirección en memoria de
otra variable, en lugar de un dato
convencional. Es un tipo de datos simple.
Puntero

La variable pun
Memoria num: 536 contiene una dirección
Estática (FAFB)
pun: FAFB
En la
Memoria FAFA FAFB s dirección
e
Dinámica ‘a’ FAFB almacen encuentra
ado el v
C P U al o r 7
Clase
Clase 11
9
CADP – Tipo de dato - Puntero

Características:
Es un tipo de dato simple que contiene la
dirección donde se encuentra almacenado el
Puntero dato real.
Pueden apuntar solamente a direcciones
almacenadas en memoria dinámica (heap).

e Cada variable de tipo puntero puede


s
o ? apuntar a un único tipo de dato.
m
Có clara
de Una variable de tipo puntero se indica con
^ y ocupa 4 bytes de memoria (stack) para
Clase
Clase 11
9
su representación interna en Pascal. 8
CADP – Tipo de dato – Puntero - Declaración

TYPE
identificador= ^TipoVariableApuntada;

e r c u a l q u i e r a d e
Puede s u e
i po s d e d a to s q
los t l
v i st o h a s t a e
hemos
momento
Ejemplos?
Clase 9
Clase 11
9
CADP – Tipo de dato – Puntero - Declaración

Program uno;
TYPE
punteroAEntero = ^integer;

VAR
pun:PunteroAEntero;

Ejemplos?
1
Clase
Clase 11
9 0
CADP – Tipo de dato – Puntero - Declaración
Program uno;
Type
TipoCadena = array [1..10] of char;
Cuánto ocupa
PunCadena = ^TipoCadena;
ca da va ria b le?
PunReal = ^real;
PunString = ^string; var
pReal: PunReal;
Datos = record t: PunString;
nombre: string[10]; r: PunString;
apellido: string[10]; puntero: PunCadena;
altura: real; p,q: PunDatos;
end;
PunDatos = ^datos; begin
....
end. 1
Clase
Clase 11
9 1
CADP – Tipo de dato – Puntero - Memoria

VARIABLE PUNTERO VARIABLE REFERENCIADA

Una variable de tipo puntero ocupa Un dato referenciado o


una cantidad de memoria fija, apuntado, como los ejemplos
independiente del tipo de dato al vistos, no tienen memoria
que apunta. asignada, o lo que es lo mismo
no existe inicialmente espacio
Una variable de tipo puntero puede reservado en memoria para este
reservar y liberar memoria durante dato.
la ejecución de un programa.
Operaciones
Clase
Clase 11
9
para el tipo 1
2
CADP – Tipo de dato – Puntero - Operaciones

Creación de una variable puntero.

Destrucción de una variable puntero.

Asignación entre variables puntero.

Asignación de un valor al contenido de una


variable puntero.

Comparación de una variable puntero


1
Clase
Clase 11
9 3
CADP – Tipo de dato – Puntero – Operaciones - Creación

Creación de una variable puntero: new (variable punetero)


Program uno;
Type
puntero = ^integer;
Var
num:integer; num: 536
p:puntero;
p: ? FAFB
Begin
new (p); FAFA
… ???? FAFB
End.
1
Clase
Clase 11
9 C P U 4
CADP – Tipo de dato – Puntero – Operaciones - Eliminación

Eliminación de una variable puntero: dispose(variable


punetero)
Program uno;
Type
puntero = ^integer;
Var
p:puntero;

Begin p: FAFB
????
new (p); FAFA

dispose(p);
???? FAFB
End. 1
Clase
Clase 11
9 C P U 5
CADP – Tipo de dato – Puntero – Operaciones - Eliminación

Eliminación de una variable puntero: p:=nil

Program uno;
Type
puntero = ^integer;
Var
p:puntero;

Begin p: FAFB
????
new (p); FAFA
… n i l
c i
n e?a ???? FAFB
p:= nil;
f e r e s
End.
i
D disp o
Clase
Clase 11
9
y C P U
1
5
CADP – Tipo de dato – Puntero – Operaciones - Asignación

Dispose (p); p:= nil;

Gráficamente?

Libera la conexión que existe entre Libera la conexión que existe entre
la variable y la posición de la variable y la posición de
memoria. memoria.

Libera la posición de memoria. La memoria sigue ocupada.

La memoria liberada puede La memoria no se puede1


Clase 11
Clase 9 7
utilizarse en otro momento del referenciar ni utilizar.
CADP – Tipo de dato – Puntero – Operaciones - Asignación

DISPOSE NIL

Memoria p=FFAA
p?? Memoria p=nil
p=FFAA

33 FFAA 33 FFAA
DISPOSE (P) P:= nil

1
Clase
Clase 11
9 8
CADP – Tipo de dato – Puntero – Operaciones - Asignación

Asignación de dos variables puntero: :=


Program uno;
Type
puntero = ^integer;
Var
q:puntero;
p:puntero; q: ? FAFB
p: ? FAFB
Begin
new (p); FAFA
q:=p; ???? FAFB
End.
1
Clase
Clase 11
9 C P U 9
CADP – Tipo de dato – Puntero – Operaciones - Asignación

Asignación de dos variables puntero: :=


Program uno;
Type
puntero = ^integer; C ó mo qu e d a
Var
q:puntero;
la memoria?
p:puntero;
Begin Begin
new (p); new (p);
q:=p; q:=p;
p:= nil; dispose (p);
End. End. 2
Clase
Clase 11
9 0
CADP – Tipo de dato – Puntero – Operaciones - Contenido

Para acceder al contenido de una variable puntero: ^


Program uno; La variable puntero debe tener
una dirección asignada para poder
Type darle contenido
puntero = ^integer;
Var
p:puntero;

Begin p: ????
FAFB
new(p); FAFA
p^:= 123; 123
???? FAFB
Las operaciones permitidas
para el contenido depende del
2
Clase
Clase 11
9 tipo que se apunta C P U 1
CADP – Tipo de dato – Puntero – Operaciones - Ejercicios
Begin
Cómo queda la new (p); p^:= 14;
memoria? write (p^);
Qué imprime? q:=p; q^:= q^*10;
Begin write (p^, q^);
Begin dispose (q);
new (p);
new (p); write (p^, q^);
new(q);
new(q); End.
p:= q; Begin
q^:= -10;
q:=10; new (p); p^:= 14;
write(q^); write (p^);
write(q^); q:=p; q^:= q^*10;
write(p^);
write(p^); write (p^, q^);
End. q:=nil;
End.
write (p^, q^); 2
Clase
Clase 11
9 2
CADP – Tipo de dato – Puntero – Operaciones - Ejercicios

Operaciones:
if (p = nil) then, compara si el puntero p no
Repasamos tiene dirección asignada.

if (p = q) then, compara si los punteros p y q


apuntan a la misma dirección de memoria.

if (p^ = q^) then, compara si los punteros p


y q tienen el mismo contenido.

2
Clase
Clase 11
9 3
CADP – Tipo de dato – Puntero – Operaciones - Ejercicios

Operaciones:
No se puede hacer read (p), si p es una
variable de tipo puntero.
Repasamos
No se puede hacer write (p), si p es una
variable de tipo puntero.

No se puede asignar una dirección a un


puntero de manera manual (p:= ABCD).

No se pueden realizar operaciones de mayor


o menor entre las direcciones de los
punteros (p>q)
2
Clase
Clase 11
9 4
CADP – Tipo de dato – Puntero – Operaciones - Memoria

Cuánta memoria ocupan las variables ?


Cuánto
Tamaño de las variables:
Program cinco;
Type
ocupa pru?
Char = 1byte Estudiante = record
Integer = 4 bytes nombre : string [20];
Real = 8 bytes
calificacion : integer;
Boolean = 1 byte
String = cantidad de
end;
caracteres + 1 bytes
Registro = la suma de lo que PunEstudiante = ^ Estudiante;
ocupa c/ campo Var
Puntero = 4 bytes pru: PunEstudiante;
4 Bytes de memoria estática
2
Clase
Clase 11
9 5
CADP – Tipo de dato – Puntero – Operaciones - Memoria

Cuánta memoria ocupan las variables ?


Program cinco; Cuánto
Type ocupa pru?
Tamaño de las variables: Estudiante = record
Char = 1byte nombre : string [20];
Integer = 4 bytes calificacion : integer;
Real = 8 bytes
Boolean = 1 byte
end;
String = cantidad de
caracteres + 1 bytes PunEstudiante = ^ Estudiante;
Registro = la suma de lo Var
que ocupa c/ campo pru: PunEstudiante;
Puntero = 4 bytes
Begin
new(pru);

Clase
4 Bytes de memoria estática + 25 Bytes de memoria dinámica
Clase 11
9
2
6
CADP – Tipo de dato – Puntero – Operaciones - Memoria

Cuánta memoria ocupan las variables ?


Program cinco; Cuánto
Type ocupa pru?
Tamaño de las variables: Estudiante = record
Char = 1byte nombre : string [20];
Integer = 4 bytes calificacion : integer;
Real = 8 bytes
Boolean = 1 byte
end;
String = cantidad de
caracteres + 1 bytes PunEstudiante = ^ Estudiante;
Registro = la suma de lo Var
que ocupa c/ campo pru: PunEstudiante;
Puntero = 4 bytes
Begin
new(pru);pru^.nombre:= ‘Pepe’;

Clase
Clase 11
9
Lo mismo que antes (29), ya que sólo modifica el contenido 2
7
CADP – Tipo de dato – Puntero – Operaciones - Memoria

Cuánta memoria ocupan las variables ?

Cuánto
Type ocupa p1?
cadena = string [255];
pcadena = ^ string [255]; Cuánto
ocupa p
pun1 = array[1…3000] of cadena; a?
pun2 = array[1..3000] of pcadena;

Var Cargue las dos estructuras de


p1: pun1; manera completa.
pa: pun2;
Calcule cuánto ocupa p1 y pa
Clase
Clase 11
9 ahora. 2
8
CADP – Tipo de dato – Puntero – Operaciones - Memoria

Cuánta memoria ocupan las variables ?

Type
cadena = string [255];
pcadena = ^ string [255];
pun1 = array[1…3000] of cadena;
pun2 = array[1..3000] of pcadena;

Var
p1: pun1; p1 = 3000 * (255 + 1) = 768000
pa: pun2; pa = 3000 * (4) = 12000

2
Clase
Clase 11
9 9
CADP – Tipo de dato – Puntero – Operaciones - Memoria

Cuánta memoria ocupan las variables ?


string string string string string string string

Type
cadena = string [255]; Begin
pcadena = ^ string [255]; for i := 1 to 3000 do
pun1 = array[1…3000] of cadena; begin
pun2 = array[1..3000] of pcadena; read (x);
p1[i]:= x;
Var end;
p1: pun1; End.
pa: pun2; Begin
x:cadena; for i := 1 to 3000 do
i:integer; read (p1[i]);
p1 = 3000 * (255 + 1) = 768000End.
3
Clase
Clase 11
9 0
CADP – Tipo de dato – Puntero – Operaciones - Memoria
Cuánta memoria ocupan las variables ?
^string ^string ^string ^string ^string ^string ^string

Begin
Type for i := 1 to 3000 do
cadena = string [255]; begin
pcadena = ^ string [255]; read (x);
pun1 = array[1…3000] of cadena; new (pa[i]);
pun2 = array[1..3000] of pcadena; pa[i]^:= x;
end;
Var End.
p1: pun1; Begin
pa: pun2; for i := 1 to 3000 do
x:cadena; new(pa[i])
i:integer; read (pa[i]^);
pa = 3000 * (4 + 256) = 780000End.
3
Clase
Clase 11
9 1
CADP – Tipo de dato – Puntero – Operaciones - Memoria

p1 = 3000 * (255 + 1) = 768000


pa = 3000 * (4 + 256) = 780000

Siempre pa ocupa
más memoria que p1?

3
Clase
Clase 11
9 2

También podría gustarte