Aula ponteiros.ppt [Modo de Compatibilidade] · Exemplo um ponteiro apontando para uma variável...

21
Programação II Aula 1

Transcript of Aula ponteiros.ppt [Modo de Compatibilidade] · Exemplo um ponteiro apontando para uma variável...

Programação II

Aula 1

Ponteiros

Variáveis

Variáveis estáticas

Variáveis dinâmicas Podem ser criadas e destruídas durante a

execução de um programa. Declaração -> Indireta Vinculação -> Por meio de ponteiros Vantagens

Áreas de Memória

Mapa de memória de um computador padrão IBM-PC

O tipo pointer

Armazena um endereço de memória e não um dado

Uso do ^ Exemplos:

Var P_nome : ^string; P_idade : ^integer; P_salario : ^real;

O tipo pointer

Exemplos: write(‘Idade = ‘,P_idade^);

Sugestão: Padronização de nomes Ponteiro vazio - NIL Operador @

Ex: P_idade := @idade;

Exemplo:Exemplo um ponteiro apontando para uma variável inteira.

Exercicios:

Declare 2 variáveis inteiras e dois ponteiros para inteiros que devem ser associados ao endereço das variáveis. Usando somente os ponteiros faça com que as variáveis recebam o dobro e o triplo de seu valor respectivamente,

Alocação dinâmica de memória

Procedimento new(ponteiro) Aloca espaço de memória alta para

armazenar uma variável alocada dinamicamente por vez.

Procedimento dispose(ponteiro) Libera o espaço de memória,

endereçada pelo ponteiro, existente na área de memória (HEAP).

IMPORTANTE: Sempre que um espaço de memória for alocado dinamicamente, ele tem que ser liberado explicitamente. Ou seja a cada new, deve corresponder um dispose, pois o espaço de memória alocado explicitamente não será liberado automaticamente.

Alocação dinâmica de memória

MemAvail => Exibe a quantidade total de memória livre no HEAP, ou seja a soma de todos os blocos de memória livres.

Procedimento MaxAvail => Retorna o tamanho do maior bloco contínuo de memória no HEAP. Este valor corresponde ao maior tamanho possível de variável dinâmica que pode ser alocado a qualquer tempo.

Obs: Estas funções estão disponíveis apenas no Turbo Pascal.

Algumas funções de gerenciamento de memória em Pascal

Algumas funções de gerenciamento de memória no Delphi

No Delphi temos duas variáveis expostas que possibilitam o controle da memória são: AllocMemSize => Variável que retorna a quantidade

de bytes alocados dinamicamente. AllocMemCount => Variável que retorna a quantidade

de objetos alocados dinamicamente. É interessante notar que no Delphi muitos objetos e

classes são criados dinamicamente

Funções para gerenciamento de memória SizeOf => Retorna o número de bytes

ocupados por um argumento (funciona tanto no Pascal como no Delphi).

Alocação dinâmica de memória

Ex: 1)Aloque dinamicamente duas variáveis do tipo

inteiro. Leia dois valores nestas variáveis.Verifica se o valor de A é maior que B. Em casoafirmativo exiba o quociente de A dividido porB.

2) Leia 5 valores e apresente o total da somados mesmos. Crie dinamicamente a variávelque irá receber os valores. Exiba a quantidadede memória antes e depois da alocação dememória para a variável e depois da liberaçãoda mesma.

GetMem => Também é usado para alocar dinamicamente espaço de memória para uma variável. Gerencia melhor o espaço de memória. A variável criada pode ter o número de bytes especificado pelo programador.

Sintaxe GetMem(ponteiro,numero_de_bytes);

Ex: GetMem(P_nome, 30);GetMem(P_total, 20);

Obs: SizeOf(tipo) é uma função que retorna a quantidade de bytes usada para armazenar uma variável do tipo passado como parâmetro.

Alocação dinâmica de memória

FreeMem => Destrói uma variável criada dinamicamente, liberando seu espaço de memória. Deve ser usada em conjunto com GetMem.

Ex: FreeMem(P_nome, 30);FreeMem(P_total, 20);

Obs: Especificar exatamente a mesma quantidade de bytes que foi alocada.

Alocação dinâmica de memória

Alocação dinâmica de memória é mais útil para alocação de grandes volumes de dados. Até agora vimos como fazer a alocação apenas de uma variável por vez. Veremos como trabalhar com vetores e matrizes alocados dinamicamente.

Alocação dinâmica de memória

Alocação dinâmica de memória –Vetores e matrizes

Satisfaz a necessidade de criarmos uma matriz com uma quantidade de elementos desconhecida em tempo de projeto.

Deve-se criar um tipo matriz. Pode-se usar a constante MaxInt pré-

definida. Declara-se uma variável que seja do tipo

ponteiro para o tipo matriz criado. Faz-se alocação dinâmica de memória

usando-se GetMem e SizeOf.

Alocação dinâmica de memória –Vetores e matrizes

Ex de criação do tipo e declaração do ponteiro:

TypeP_mat = ^vetor;vetor = array[1..MaxInt] of integer;matriz = array[1..181,1..181];

Varaponta : P_mat;aponta_mat : ^matriz;

Alocação dinâmica de memória –Vetores e matrizes

Ex. de alocação dinâmica da memória do vetor:getMem(aponta, N * SizeOf(integer));

Onde N é a quantidade de elementos que se deseja no vetor

Ex. de utilização dos elementos do vetor:for x:= 1 to N do

writeln(aponta^[x]);

Alocação dinâmica de memória –Vetores e matrizes

Ex. de alocação dinâmica da memória da matriz:getMem(aponta, L * C * SizeOf(integer));

Onde L é a quantidade de linhas que se deseja na matriz e C é a quantidade de colunas.

Ex. de utilização dos elementos da matriz:for x:= 1 to L dofor y := 1 to C do

writeln(aponta_mat^[x,y]);

Alocação dinâmica de memória –Vetores e matrizes

Liberando a memória do vetorfreeMem(aponta,N * SizeOf(integer));

Liberando a memória da matrizfreeMem(aponta_mat, L * C * SizeOf(integer));