Вы находитесь на странице: 1из 18

Universidade Federal de Sergipe

Centro de Cincias Exatas e Tecnologia Departamento de Computao

Alocao Dinmica em Pascal

Professor Felipe Cardoso, M.Sc.


Slide 1

Objetivo da Aula
Nivelar os alunos no que diz respeito ao uso de ponteiros e arquivos tipados.

Slide 2

Contedo
Alocao Dinmica de Memria Ponteiros Tipados
Alocao Desalocao

Ponteiros Sem Tipo


Alocao Desalocao Realocao Copiando dados na memria

Slide 3

Ponteiros
Um ponteiro uma varivel cujo contedo um endereo de memria. Quando este contedo o endereo de outra varivel, dizemos que o ponteiro aponta para esta outra varivel. Um ponteiro pode ser tipado ou sem tipo. Um ponteiro tipado aponta para um endereo de memria cujo contedo de um tipo predefinido. Um ponteiro sem tipo pode apontar para qualquer tipo de dados.

Slide 4

Ponteiro Tipado
Declarao <PointerName> : ^<Type>; Exemplo PNumero : ^Integer; Representao Grfica
O contedo do ponteiro o endereo de uma varivel do tipo Integer

Endereo da Varivel

PNumero 0x1234

0x1234 10
Contedo da Varivel

Slide 5

Ponteiro Tipado
Outra representao PNumero aponta para a varivel X.
PNumero X 10
Varivel X do tipo Integer

Para acessar o contedo da varivel para a qual o ponteiro aponta, utiliza-se o caractere ^ Exemplo Writeln(IntToStr(PNumero^));
No exemplo acima, estamos escrevendo em tela, o contedo do endereo para o qual o ponteiro aponta. Neste caso, ser impresso o valor 10.
Slide 6

Ponteiro Tipado
Obtendo do Endereo de uma Varivel Para que um ponteiro aponte para determinada varivel, necessrio conhecer seu endereo e atribu-lo ao ponteiro.
O endereo obtido a partir do caractere @.

Exemplo
program PonteiroTipado; var X : Integer; PNumero : ^Integer; begin 1 X := 10; 2 PNumero := @X; 3 Writeln(IntToStr(PNumero^)); Readln; End.

Slide 7

Ponteiro Tipado
Na linha 1, o valor inteiro 10 atribudo varivel X. Inicialmente, o ponteiro PNumero no aponta para nenhuma rea de memria. Diz-se que PNumero aponta para a Terra.
PNumero X (0x1234) 10

Na linha 2, o endereo da varivel X atribudo ao ponteiro PNumero. Graficamente, a memria do programa pode ser representada como abaixo.
PNumero 0x1234 X (0x1234) 10
Slide 8

Ponteiro Tipado
Alocando Memria Dinamicamente Para alocar uma rea de memria e atribuir seu endereo a um ponteiro, pode-se utilizar o operador New. Sintaxe New(<PointerName>); Exemplo New(PNumero);

Slide 9

Ponteiro Tipado
Exemplo
No exemplo abaixo, alocado uma rea de memria cujo endereo atribudo ao ponteiro PNumero. Alm disso, atribudo o valor numrico 20 ao contedo da rea de memria.
program PonteiroTipado; var PNumero : ^Integer; begin //Alocando rea de memria New(PNumero); PNumero^ := 20; Writeln(IntToStr(PNumero^)); Readln; end.

PNumero 0x4768

(0x4768) 20

Slide 10

Ponteiro Tipado
Desalocando a Memria A rea de memria alocada com a rotina New no desalocada automaticamente pelo ambiente. Deve-se utilizar a rotina Dispose para liberar a memria alocada.
Caso contrrio, a memria ser liberada apenas quando o programa for encerrado.

Exemplo Dispose(PNumero);

Slide 11

Ponteiro Sem Tipo


Um ponteiro sem tipo permite apontar para dados de qualquer tipo. Cabe ao programador alocar a memria considerando o tipo de dados para o qual o ponteiro apontar. Sintaxe <PointerName> : Pointer; Exemplo PNumero : Pointer;

Slide 12

Ponteiro Sem Tipo


Para utilizar o ponteiro sem tipo, o programador deve alocar uma rea de memria do tamanho dos dados que sero armazenados nesta rea de memria.
Considerando que se deseja criar um ponteiro para apontar para uma rea de memria que abrigar um valor Real, devese alocar espao suficiente para comportar um valor Real, ou seja, 8 bytes.

Sintaxe
GetMem(<PointerName>, <Size>)

Exemplo GetMem(PReal, 8);


Slide 13

Ponteiro Sem Tipo


Se o tamanho do tipo de dados no for conhecido, pode-se utilizar a funo SizeOf, que retorna o tamanho do tipo de dado. Exemplo
GetMem(Preal, SizeOf(Real));

Desalocando um Ponteiro Sem Tipo Sintaxe


FreeMem(<PointerName>);

Exemplo
FreeMem(PReal);

Slide 14

Ponteiro Sem Tipo


Para atribuir um valor rea de memria para a qual um ponteiro sem tipo aponta, deve-se fazer um casting do ponteiro, informando o tipo de informao que ser atribuda rea de memria. Exemplo Real(PReal^) := 8.5;

Slide 15

Ponteiro Sem Tipo


Exemplo de Programa Completo
program PonteiroSemTipo; var PReal : Pointer; begin GetMem(PReal, SizeOf(Real)); Real(PReal^) := 8.5; Writeln(Real(PReal^)); FreeMem(PReal); Readln; end.

Slide 16

Ponteiro Sem Tipo


Realocando a Memria A rea de memria alocada com a rotina GetMem pode ser alterada a partir do procedimento ReallocMem. Exemplo ReallocMem(P, NBytes); Observao Os dados existentes no local para o qual o ponteiro aponta no so afetados, a menos que NBytes seja menor que o tamanho anterior.
Slide 17

Ponteiro Sem Tipo


Copiando Dados Algumas vezes necessrio copiar uma certa quantidade de bytes de um local da memria para outro. Para isso, utiliza-se a rotina Move. Sintaxe Move(Origem, Destino, NBytes) Exemplo
var A : array[1..4] of char; B : Integer; Begin ... Move(A, B, SizeOf(B)); end;
Slide 18