Aula prática 9 Alocação Dinâmica Monitoria de Introdução à Programação
+00+-+Alocação+Dinâmica+e+Arquivos+Tipados
-
Upload
natan-macedo -
Category
Documents
-
view
32 -
download
0
Transcript of +00+-+Alocação+Dinâmica+e+Arquivos+Tipados
5/9/2018 +00+-+Alocação+Dinâmica+e+Arquivos+Tipados - slidepdf.com
http://slidepdf.com/reader/full/00-alocacaodinamicaearquivostipados 1/18
Alocação Dinâmica em Pascal
Universidade Federal de SergipeCentro de Ciências Exatas e Tecnologia
Departamento de Computação
Slide 1
Professor
Felipe Cardoso, M.Sc.
5/9/2018 +00+-+Alocação+Dinâmica+e+Arquivos+Tipados - slidepdf.com
http://slidepdf.com/reader/full/00-alocacaodinamicaearquivostipados 2/18
Objetivo da Aula
Nivelar os alunos no que diz respeito ao uso de ponteiros e
arquivos tipados.
Slide 2
5/9/2018 +00+-+Alocação+Dinâmica+e+Arquivos+Tipados - slidepdf.com
http://slidepdf.com/reader/full/00-alocacaodinamicaearquivostipados 3/18
Conteúdo
Alocação Dinâmica de Memória
Ponteiros Tipados
• Alocação
• Desalocação
Ponteiros Sem Tipo
Slide 3
• Alocação• Desalocação
• Realocação
• Copiando dados na memória
5/9/2018 +00+-+Alocação+Dinâmica+e+Arquivos+Tipados - slidepdf.com
http://slidepdf.com/reader/full/00-alocacaodinamicaearquivostipados 4/18
Ponteiros
Um ponteiro é uma variável cujo conteúdo é um endereço
de memória.
Quando este conteúdo é o endereço de outra variável,dizemos que o ponteiro aponta para esta outra variável.
Slide 4
Um ponteiro pode ser tipado ou sem tipo.Um ponteiro tipado aponta para um endereço de
memória cujo conteúdo é de um tipo predefinido.
Um ponteiro sem tipo pode apontar para qualquer tipo dedados.
5/9/2018 +00+-+Alocação+Dinâmica+e+Arquivos+Tipados - slidepdf.com
http://slidepdf.com/reader/full/00-alocacaodinamicaearquivostipados 5/18
Ponteiro Tipado
Declaração
<PointerName> : ^<Type>;
Exemplo
PNumero : ^Integer;
Slide 5
Representação Gráfica
0x1234
PNumero
Conteúdo da Variável
Endereço da Variável
10
0x1234
O conteúdo do ponteiro é o endereço
de uma variável do tipo Integer
5/9/2018 +00+-+Alocação+Dinâmica+e+Arquivos+Tipados - slidepdf.com
http://slidepdf.com/reader/full/00-alocacaodinamicaearquivostipados 6/18
Ponteiro Tipado
Outra representação
PNumero aponta para a variável X.
PNumero
10
X
Variável X do tipo Integer
Slide 6
Para acessar o conteúdo da variável para a qual o ponteiroaponta, utiliza-se o caractere “^”
Exemplo
Writeln(IntToStr(PNumero^));• No exemplo acima, estamos escrevendo em tela, o conteúdo do
endereço para o qual o ponteiro aponta.
• Neste caso, será impresso o valor 10.
5/9/2018 +00+-+Alocação+Dinâmica+e+Arquivos+Tipados - slidepdf.com
http://slidepdf.com/reader/full/00-alocacaodinamicaearquivostipados 7/18
Ponteiro Tipado
Obtendo do Endereço de uma Variável
Para que um ponteiro aponte para determinada variável,
é necessário conhecer seu endereço e atribuí-lo aoponteiro.
• O endereço é obtido a partir do caractere @.
Slide 7
xemp oprogram PonteiroTipado;
var
X : Integer;
PNumero : ^Integer;
begin1 X := 10;
2 PNumero := @X;
3 Writeln(IntToStr(PNumero^));
Readln;
End.
5/9/2018 +00+-+Alocação+Dinâmica+e+Arquivos+Tipados - slidepdf.com
http://slidepdf.com/reader/full/00-alocacaodinamicaearquivostipados 8/18
Ponteiro Tipado
Na linha 1, o valor inteiro 10 é atribuído à variável X. Inicialmente, o
ponteiro PNumero não aponta para nenhuma área de memória. Diz-se
que PNumero aponta para a Terra.
10
X (0x1234)PNumero
Slide 8
Na linha 2, o endereço da variável X é atribuído ao ponteiro PNumero.
Graficamente, a memória do programa pode ser representada como
abaixo.
10
X (0x1234)
0x1234
PNumero
5/9/2018 +00+-+Alocação+Dinâmica+e+Arquivos+Tipados - slidepdf.com
http://slidepdf.com/reader/full/00-alocacaodinamicaearquivostipados 9/18
Ponteiro Tipado
Alocando Memória Dinamicamente
Para alocar uma área de memória e atribuir seu
endereço a um ponteiro, pode-se utilizar o operador New.
Slide 9
SintaxeNew(<PointerName>);
ExemploNew(PNumero);
5/9/2018 +00+-+Alocação+Dinâmica+e+Arquivos+Tipados - slidepdf.com
http://slidepdf.com/reader/full/00-alocacaodinamicaearquivostipados 10/18
Ponteiro Tipado
Exemplo No exemplo abaixo, é alocado uma área de memória cujo endereço é
atribuído ao ponteiro PNumero. Além disso, é atribuído o valor numérico 20
ao conteúdo da área de memória.
program PonteiroTipado;
var
PNumero
Slide 10
begin
//Alocando área de memória
New(PNumero);
PNumero^ := 20;
Writeln(IntToStr(PNumero^));Readln;
end. 20
(0x4768)
0x4768
5/9/2018 +00+-+Alocação+Dinâmica+e+Arquivos+Tipados - slidepdf.com
http://slidepdf.com/reader/full/00-alocacaodinamicaearquivostipados 11/18
Ponteiro Tipado
Desalocando a Memória
A área de memória alocada com a rotina New não é
desalocada automaticamente pelo ambiente.Deve-se utilizar a rotina Dispose para liberar a memória
alocada.
Slide 11
• Caso contrário, a memória será liberada apenas quando oprograma for encerrado.
Exemplo
Dispose(PNumero);
5/9/2018 +00+-+Alocação+Dinâmica+e+Arquivos+Tipados - slidepdf.com
http://slidepdf.com/reader/full/00-alocacaodinamicaearquivostipados 12/18
Ponteiro Sem Tipo
Um ponteiro sem tipo permite apontar para dados de
qualquer tipo.
Cabe ao programador alocar a memória considerando otipo de dados para o qual o ponteiro apontará.
Slide 12
Sintaxe<PointerName> : Pointer;
Exemplo
PNumero : Pointer;
5/9/2018 +00+-+Alocação+Dinâmica+e+Arquivos+Tipados - slidepdf.com
http://slidepdf.com/reader/full/00-alocacaodinamicaearquivostipados 13/18
Ponteiro Sem Tipo
Para utilizar o ponteiro sem tipo, o programador deve alocar uma área de memória do tamanho dos dados que serãoarmazenados nesta área de memória.
Considerando que se deseja criar um ponteiro para apontar para uma área de memória que abrigará um valor Real, deve-se alocar espaço suficiente para comportar um valor Real, ou
Slide 13
, .
Sintaxe
GetMem(<PointerName>, <Size>)
Exemplo
GetMem(PReal, 8);
5/9/2018 +00+-+Alocação+Dinâmica+e+Arquivos+Tipados - slidepdf.com
http://slidepdf.com/reader/full/00-alocacaodinamicaearquivostipados 14/18
Ponteiro Sem Tipo
Se o tamanho do tipo de dados não for conhecido, pode-se
utilizar a função SizeOf, que retorna o tamanho do tipo de
dado.Exemplo
• GetMem(Preal, SizeOf(Real));
Slide 14
Desalocando um Ponteiro Sem Tipo
Sintaxe
• FreeMem(<PointerName>);
Exemplo
• FreeMem(PReal);
5/9/2018 +00+-+Alocação+Dinâmica+e+Arquivos+Tipados - slidepdf.com
http://slidepdf.com/reader/full/00-alocacaodinamicaearquivostipados 15/18
Ponteiro Sem Tipo
Para atribuir um valor à área de memória para a qual um
ponteiro sem tipo aponta, deve-se fazer um casting do
ponteiro, informando o tipo de informação que seráatribuída à área de memória.
Slide 15
xemp oReal(PReal^) := 8.5;
5/9/2018 +00+-+Alocação+Dinâmica+e+Arquivos+Tipados - slidepdf.com
http://slidepdf.com/reader/full/00-alocacaodinamicaearquivostipados 16/18
Ponteiro Sem Tipo
Exemplo de Programa Completo
program PonteiroSemTipo;var
PReal : Pointer;
Slide 16
GetMem(PReal, SizeOf(Real));Real(PReal^) := 8.5;
Writeln(Real(PReal^));
FreeMem(PReal);
Readln;
end.
5/9/2018 +00+-+Alocação+Dinâmica+e+Arquivos+Tipados - slidepdf.com
http://slidepdf.com/reader/full/00-alocacaodinamicaearquivostipados 17/18
Ponteiro Sem Tipo
Realocando a Memória
A área de memória alocada com a rotina GetMem pode
ser alterada a partir do procedimento ReallocMem.
Exemplo
Slide 17
ReallocMem(P, NBytes);
Observação
Os dados existentes no local para o qual o ponteiroaponta não são afetados, a menos que NBytes seja
menor que o tamanho anterior.
5/9/2018 +00+-+Alocação+Dinâmica+e+Arquivos+Tipados - slidepdf.com
http://slidepdf.com/reader/full/00-alocacaodinamicaearquivostipados 18/18
Ponteiro Sem Tipo
Copiando Dados
Algumas vezes é necessário copiar uma certa
quantidade de bytes de um local da memória para outro.Para isso, utiliza-se a rotina Move.
Sintaxe
Slide 18
Move(Origem, Destino, NBytes) Exemplo
var
A : array[1..4] of char;
B : Integer;Begin
...
Move(A, B, SizeOf(B));
end;