Aula ponteiros.ppt [Modo de Compatibilidade] · Exemplo um ponteiro apontando para uma variável...
Transcript of Aula ponteiros.ppt [Modo de Compatibilidade] · Exemplo um ponteiro apontando para uma variável...
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
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]);