Documentos de Académico
Documentos de Profesional
Documentos de Cultura
(Introducción)
Las estructuras de datos hasta ahora vistas se almacenan
estáticamente en la memoria física del ordenador.
* 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.
Prog. 2 - 2022 1
APUNTADORES
(Introducción)
Prog. 2 - 2022 3
APUNTADORES
(Gráficamente)
Prog. 2 - 2022 4
APUNTADORES
(Definición y Declaración)
Dentro de «Delphi» hay 2 tipos de variables puntero:
1. Las definidas por el usuario
2. Los punteros de propósito general.
Caso 1
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 este caso un puntero sólo puede señalar a objetos de un
mismo tipo, el establecido en la declaración.
Caso 2
Existe un tipo de dato genérico que permite almacenar una
dirección de memoria (un puntero) que se llama «Pointer».
Esto permite poder apuntar a un tipo de dato NO declarado en el
TYPE.
Prog. 2 - 2022 5
APUNTADORES
(Ejemplos)
Ejemplo I:
TYPE
Puntero_a_Char = ^char;
VAR
Variable_Puntero_a_Char : Puntero_a_Char;
Ejemplo II:
TYPE
Puntero_a_Nodo = ^Nodo;
Nodo = record
info : String;
Sig : Puntero_a_Nodo;
end;
VAR
Variable_Nodo : Puntero_a_Nodo;
Prog. 2 - 2022 6
APUNTADORES
(Tener en cuenta)
• Estas variables son los punteros que en Delphi es un tipo de dato simple.
Prog. 2 - 2022 7
APUNTADORES
(Instrucciones)
• 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 Delphi la creación y destrucción de variables dinámicas se realiza
mediante los siguientes procedimientos:
– New(variable_de_tipo_puntero) // Crea el puntero
– Dispose(variable_de_tipo_puntero) // Destruye el puntero
New(puntero)
– Reserva la memoria necesaria para un dato del tipo apropiado.
– Coloca la dirección de memoria de esta nueva variable en «puntero».
Prog. 2 - 2022 8
APUNTADORES
(Instrucciones)
Dispose (puntero)
– Libera la memoria asociada a la variable referida (dejándola
libre para otros fines).
– Deja indefinido el valor del puntero.
Prog. 2 - 2022 9
APUNTADORES
(Operaciones)
• El contenido de la variable referenciada por el puntero se denota:
puntero^
• Las operaciones permitidas para esta nueva variables son:
– Asignación
– Lectura
– Escritura
– Todas las operaciones legales que se puedan realizar con dicho
tipo.
• Ejemplo:
TYPE
tApcar = ^char;
VAR
Apcar : tApcar;
BEGIN
New(Apcar);
Readln(Apcar^); //Por ejemplo ‘B’
Apcar^ := Pred(Apcar^);
Writeln(Apcar^);
END.
Prog. 2 - 2022 10
APUNTADORES
(Operaciones - Ejemplos)
TYPE
tApnum = ^integer;
VAR
Apnum1, Apnum2 : tApnum;
BEGIN
New(Apnum1);
New(Apnum2);
Apnum1^ := 2;
Apnum2^ := 4;
Apnum2^ := Apnum1^ + Apnum2^;
Apnum1^ := Apnum2^ DIV 2;
END.
Prog. 2 - 2022 11
APUNTADORES
(Operaciones - Ejemplos)
TYPE
tVector10 = array [1..10] of real;
tApnumero = ^integer;
tApvector = ^tvector10;
VAR
Apnum1, Apnum2 : tApnum;
Apvect : tApvector10;
i : integer;
BEGIN
New(apvect);
Apvect^[1] := 2;
for i:=2 to 10 do begin
Apvect^[i] := Apvect^[i-1] * 2;
end;
END.
Prog. 2 - 2022 12
APUNTADORES
(Operaciones Básicas)
• 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
Prog. 2 - 2022 13
APUNTADORES
(Asignación)
Prog. 2 - 2022 14
APUNTADORES
(La Constante NIL)
Prog. 2 - 2022 15
APUNTADORES
(Usos de los punteros)
• Caso 1: Asignación de datos compuestos en un solo paso
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.
TYPE TYPE
tFicha = record tApficha=^tFicha;
nombre:string; tFicha=record
direccion:string; nombre:string;
End; // tFicha direccion:string;
VAR End; //tFicha
pers1,pers2 : tFicha; VAR
BEGIN p1,p2 : tApficha;
Pers1:=pers2; //operación muy costosa BEGIN
// en espacio y tiempo p1:=p2; // asignación instantánea
END. END.
Prog. 2 - 2022 16
APUNTADORES
(Usos de los punteros)
• Caso 2: Definición de 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.
Prog. 2 - 2022 17
APUNTADORES
(Usos de los punteros en recusividad)
Prog. 2 - 2022 18
APUNTADORES
(El tipo de dato «pointer»)
Los punteros de propósito general «pointer» son usados para guardar en
tiempo de ejecución estructuras sin importar su contenido.
Son de gran flexibilidad porque permiten asignarle una dirección de
memoria que la misma puede contener cualquier cosa dentro, desde un
dato simple como un «string» hasta una estructura compleja como «array»
de registros por ejemplo.
El tipo de dato «pointer» NO soporta las operaciones de «new» y «dispose»
solo se usan para almacenar una dirección de memoria que ya debe existir.
Ejemplo:
VAR
PPG : Pointer;
PI : ^Integer;
BEGIN
New(PI); // Creo un puntero a un entero
PI ^ := 40; // Le asigno 40
PPG := PI; // La dirección de memoria de PI la asigno el puntero de propósito general
END.
Prog. 2 - 2022 19