+00+-+Alocação+Dinâmica+e+Arquivos+Tipados

18
 Alocação Dinâmica em Pascal Universidade Federal de Sergipe Centro de Ciências Exatas e Tecnologia Departamento de Computação Slide 1 Professor Felipe Cardoso, M.Sc.

Transcript of +00+-+Alocação+Dinâmica+e+Arquivos+Tipados

Page 1: +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.

Page 2: +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 2/18

 

Objetivo da Aula

Nivelar os alunos no que diz respeito ao uso de ponteiros e

arquivos tipados.

Slide 2

Page 3: +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 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

 

Page 4: +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 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.

 

Page 5: +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 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 

 

Page 6: +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 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.

 

Page 7: +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 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.

 

Page 8: +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 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

 

Page 9: +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 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);

 

Page 10: +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 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

 

Page 11: +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 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);

 

Page 12: +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 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;

 

Page 13: +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 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);

 

Page 14: +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 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);

 

Page 15: +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 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;

 

Page 16: +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 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.

 

Page 17: +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 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.

 

Page 18: +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 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;