podem ser divididas em: variáveis estáticas variáveis dinâmicas podem ser criadas e destruídas...

22

Upload: maria-de-belem-martinho-da-fonseca

Post on 07-Apr-2016

219 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: Podem ser divididas em: Variáveis estáticas Variáveis dinâmicas Podem ser criadas e destruídas durante a execução de um programa. Declaração -> Indireta
Page 2: Podem ser divididas em: Variáveis estáticas Variáveis dinâmicas Podem ser criadas e destruídas durante a execução de um programa. Declaração -> Indireta
Page 3: Podem ser divididas em: Variáveis estáticas Variáveis dinâmicas Podem ser criadas e destruídas durante a execução de um programa. Declaração -> Indireta

Podem ser divididas em: 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

Page 4: Podem ser divididas em: Variáveis estáticas Variáveis dinâmicas Podem ser criadas e destruídas durante a execução de um programa. Declaração -> Indireta

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

Page 5: Podem ser divididas em: Variáveis estáticas Variáveis dinâmicas Podem ser criadas e destruídas durante a execução de um programa. Declaração -> Indireta

Sua posição de memória armazena um endereço de outra posição de memória, que por sua vez pode conter um dado. Não armazena um dado.

Notação utiliza ^ Exemplos:

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

Page 6: Podem ser divididas em: Variáveis estáticas Variáveis dinâmicas Podem ser criadas e destruídas durante a execução de um programa. Declaração -> Indireta

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

Sugestão: Padronização de nomes Ponteiro vazio é preenchido com NIL Operador @

Ex: P_idade := @idade; (Acessa o endereço da posição de memória

referenciada)

Page 7: Podem ser divididas em: Variáveis estáticas Variáveis dinâmicas Podem ser criadas e destruídas durante a execução de um programa. Declaração -> Indireta

Exemplo: Criação de um ponteiro apontando para uma

variável inteira. Criação de um ponteiro apontando para uma variável

real.

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,

Page 8: Podem ser divididas em: Variáveis estáticas Variáveis dinâmicas Podem ser criadas e destruídas durante a execução de um programa. Declaração -> Indireta

Memória alocada conforme a necessidade

EvitaDESPERDÍCIO DE MEMÓRIA

XMEMÓRIA INSUFICIENTE

Quantidade de memória pode ser determinada em tempo de execução

Page 9: Podem ser divididas em: Variáveis estáticas Variáveis dinâmicas Podem ser criadas e destruídas durante a execução de um programa. Declaração -> Indireta

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

armazenar uma variável alocada dinamicamente por vez.

Page 10: Podem ser divididas em: Variáveis estáticas Variáveis dinâmicas Podem ser criadas e destruídas durante a execução de um programa. Declaração -> Indireta

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.

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

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

Page 11: Podem ser divididas em: Variáveis estáticas Variáveis dinâmicas Podem ser criadas e destruídas durante a execução de um programa. Declaração -> Indireta

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.

Page 12: Podem ser divididas em: Variáveis estáticas Variáveis dinâmicas Podem ser criadas e destruídas durante a execução de um programa. Declaração -> Indireta

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 caso afirmativo exiba o quociente de A dividido por B.

2) Leia 5 valores e apresente o total da soma dos mesmos. Crie dinamicamente a variável que irá receber os valores. Exiba a quantidade de memória antes e depois da alocação de memória para a variável e depois da liberação da mesma.

Page 13: Podem ser divididas em: Variáveis estáticas Variáveis dinâmicas Podem ser criadas e destruídas durante a execução de um programa. Declaração -> Indireta

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);

Como saber quantos bytes reservar? Sizeof(tipo)

Page 14: Podem ser divididas em: Variáveis estáticas Variáveis dinâmicas Podem ser criadas e destruídas durante a execução de um programa. Declaração -> Indireta

Função útil na alocação de blocos de memória:

SizeOf Retorna o número de bytes ocupados por um

argumento (funciona tanto no Pascal como no Delphi).

Page 15: Podem ser divididas em: Variáveis estáticas Variáveis dinâmicas Podem ser criadas e destruídas durante a execução de um programa. Declaração -> Indireta

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.

Page 16: Podem ser divididas em: Variáveis estáticas Variáveis dinâmicas Podem ser criadas e destruídas durante a execução de um programa. Declaração -> Indireta

Alocação dinâmica de memória na verdade tem uma grande utilidade para alocação de blocos 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.

Page 17: Podem ser divididas em: Variáveis estáticas Variáveis dinâmicas Podem ser criadas e destruídas durante a execução de um programa. Declaração -> Indireta

Características 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.

Page 18: Podem ser divididas em: Variáveis estáticas Variáveis dinâmicas Podem ser criadas e destruídas durante a execução de um programa. Declaração -> Indireta

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

Type P_mat = ^vetor; vetor = array[1..MaxInt] of integer; matriz = array[1..181,1..181];Var aponta : P_mat; aponta_mat : ^matriz;

Page 19: Podem ser divididas em: Variáveis estáticas Variáveis dinâmicas Podem ser criadas e destruídas durante a execução de um programa. Declaração -> Indireta

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]);

Page 20: Podem ser divididas em: Variáveis estáticas Variáveis dinâmicas Podem ser criadas e destruídas durante a execução de um programa. Declaração -> Indireta

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 do for y := 1 to C do writeln(aponta_mat^[x,y]);

Page 21: Podem ser divididas em: Variáveis estáticas Variáveis dinâmicas Podem ser criadas e destruídas durante a execução de um programa. Declaração -> Indireta

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

Liberando a memória da matrizfreeMem(aponta_mat, L * C *

SizeOf(integer));

Page 22: Podem ser divididas em: Variáveis estáticas Variáveis dinâmicas Podem ser criadas e destruídas durante a execução de um programa. Declaração -> Indireta

• Leia um número inteiro N e aloque dinamicamente memória para um vetor de N inteiros. Leia os valores do vetor e exiba a média dos valores lidos.