Está en la página 1de 9

PUNTEROS

Explicación Práctica 6

CADP 2017
Facultad de Informática - UNLP
Variables estáticas
Se conoce el tamaño máximo que van a
ocupar en memoria.
Supongamos:
Memoria RAM
Char 1 byte

Integer 4 bytes

Real 8 bytes
Pila Boolean 1 byte
o Stack
Variables cantidad de caracteres + 1
String
Registro la suma de lo que ocupa c/ campo

Puntero 4 bytes

Vector (dim. física) x (tam de dato almacenado en bytes)

Se reserva memoria en el momento que


comienza la ejecución del módulo que la
declara.
Punteros – Definición
Los punteros permiten reservar y liberar memoria en tiempo de ejecución.
Permiten crear estructuras de datos DINÁMICAS cuya cantidad de elementos
varíe durante la ejecución (no se conoce la cantidad de elementos a priori).

c e n a la d ire c ción en
:a a
Variable Puntero ble (llamada variable
lm
varia
memoria de otra
dinámica).
at o s a pu n ta d o s p o r Punteros
Memoria D

Memoria Dinámica Variables Char


(heap) dinámicas Integer
String
Variables Registro
Pila
estáticas Boolean
Arreglo
Puntero
Punteros - Uso
Declaración (ejemplo) Valores posibles de un puntero
TYPE • NIL
PtroEntero = ^ integer
• Dirección de memoria obtenida
VAR
pun, otropun: PtroEntero

Operaciones
• new(pun) Adquiere la memoria necesaria para una variable dinámica. El valor de
pun es la dirección de memoria en donde se guarda el dato del tipo apuntado.
• dispose(pun) Libera la memoria adquirida mediante el new().
El puntero queda con valor indefinido.
• Asignación
- Entre punteros de igual tipo. Ej: Pun:= otropun;
- Asignación de NIL. Ej: Pun:= NIL
• Comparación
- Entre punteros de igual tipo. Ej : if(pun = otropun)then …
- Comparación con NIL. Ej : if(pun <> NIL)then …

Acceder al dato apuntado por el puntero pun^


Ejemplo de uso de punteros I

Program ejemplo; m o ria pero es inaccesible


a e n m e
Type El dato qued
Ptro= ^integer; Memoria
Var
p1, p2: Ptro; XXXX 44
Begin Memoria
new (p1); Dinámica ZZZZ ????
23
(heap)
p1^ := 23;
new (p2);
p2^ := 44; p1 ZZZZ Variables
p2 := p1; PP
Pila p2 XXXX
ZZZZ
write (p2^);
dispose (p2);
write(p1^);
End. Im
prime
23
ERROR
Ejemplo de uso de punteros II
Program ejemplo;
Type
casa = record
Memoria
met_cua: real;
cant_hab: integer;
end;
Memoria ZZZZ met_cua 125.50
Dinámica ????
punt_casa = ^casa; Ca 5
6
Var (Heap) nt_hab
p1, p2: punt_casa;
Begin p1 ZZZZ
new (p1);
P Variables
p1^.met_cua := 125.50; p2 ZZZZ
ila PP
p1^.cant_hab := 5;
p2:= p1;
p2^.cant_hab := 6;
write (p1^.cant_hab); Im
dispose (p2); prime
write(p1^.met_cua); 6
End. ERROR
Punteros como parámetros
p1 recibe una copia de la dirección de p. Si modifico el
Program ejemplo;
Type dato apuntado por p1, el llamador verá el cambio.
punt = ^integer;

Procedure suma (p1:punt);


Begin p1: FFFF Variables
p1^ := p1^ + 1; Estáticas
End; {suma}
Var
p: punt; p: BASURA
FFFF Variables
Estáticas
Begin {Prog Pal}
new (p);
p^ := 23;
suma(p);
4 24
BASURA
23
write(p^); IMPRIME 2 Variables
End. Dinámicas
Punteros como parámetros
p1 recibe una recibe una copia de la dirección de p.
Program ejemplo; Si modifico la dirección p1, p en el programa ppal
Type tiene la misma dirección que tenía antes de la llamada.
punt = ^integer;

Procedure suma (p1:punt); ¿Qué imprime si modifico suma?


Begin
p1^ := p1^ + 1; p1: FAAF
FFFF Variables
Estáticas
new(p1); {suma}
End;

Var
al p: BASURA
FFFF
p: punt; ¿Qué ocurre Variables
m pl a za r n ew(p1) por Estáticas
ree {Prog Ppal}
Begin dispose(p1)?
new (p);
El dato queda en
p^ := 23;
memoria pero
suma(p); 24
BASURA
23
es inaccesible Variables
write(p^);
End. IMPRIME 24 Dinámicas

BASURA
Punteros como parámetros
p1 recibe la referencia de p. Si modifico la dirección
Program ejemplo; p1, estoy modificando la dirección de p en el programa
Type ppal.
punt = ^integer;

Procedure suma (VAR p1:punt);


¿Qué imprime si modifico suma?
Begin
p1^ := p1^ + 1; p1: Variables
Estáticas
new(p1); {suma}
p1^:= 44;
End;
p: FF11
BASURA
FFFF Variables
Var
Estáticas
p: punt;
{Prog Ppal}
Begin El dato queda en
new (p); memoria pero
p^ := 23; es inaccesible 24
BASURA
23
suma(p); Variables
write(p^); Dinámicas
4
I M PRIME 4
End.
44
BASURA

También podría gustarte