Podem ser divididas em Variveis estticas Variveis dinmicas

  • Slides: 22
Download presentation

 Podem ser divididas em: Variáveis estáticas Variáveis dinâmicas Podem ser criadas e destruídas

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

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

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

 Sua posição de memória armazena um endereço de outra posição de memória, que

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;

 Exemplos: write(‘Idade = ‘, P_idade^); Sugestão: Padronização de nomes Ponteiro vazio é preenchido

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)

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

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,

 Memória alocada conforme a necessidade Evita DESPERDÍCIO DE MEMÓRIA X MEMÓRIA INSUFICIENTE Quantidade

Memória alocada conforme a necessidade Evita DESPERDÍCIO DE MEMÓRIA X MEMÓRIA INSUFICIENTE Quantidade de memória pode ser determinada em tempo de execução

 Procedimento new(ponteiro) Aloca espaço de memória alta para armazenar uma variável alocada dinamicamente

Procedimento new(ponteiro) Aloca espaço de memória alta para armazenar uma variável alocada dinamicamente por vez.

 IMPORTANTE: Sempre que um espaço de memória for alocado dinamicamente, ele tem que

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

 Mem. Avail Exibe a quantidade total de memória livre no HEAP, ou seja

Mem. Avail Exibe a quantidade total de memória livre no HEAP, ou seja a soma de todos os blocos de memória livres. Procedimento Max. Avail 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.

 Ex: 1)Aloque dinamicamente duas variáveis do tipo inteiro. Leia dois valores nestas variáveis.

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.

 Get. Mem Também é usado para alocar dinamicamente espaço de memória para uma

Get. Mem 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 Get. Mem(ponteiro, numero_de_bytes); Ex: Get. Mem(P_nome, 30); Get. Mem(P_total, 20); Como saber quantos bytes reservar? Sizeof(tipo)

 Função útil na alocação de blocos de memória: Size. Of Retorna o número

Função útil na alocação de blocos de memória: Size. Of Retorna o número de bytes ocupados por um argumento (funciona tanto no Pascal como no Delphi).

 Free. Mem => Destrói uma variável criada dinamicamente, liberando seu espaço de memória.

Free. Mem => Destrói uma variável criada dinamicamente, liberando seu espaço de memória. Deve ser usada em conjunto com Get. Mem. Ex: Free. Mem(P_nome, 30); Free. Mem(P_total, 20); Obs: Especificar exatamente a mesma quantidade de bytes que foi alocada.

 Alocação dinâmica de memória na verdade tem uma grande utilidade para alocação de

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.

 Características Satisfaz a necessidade de criarmos uma matriz com uma quantidade de elementos

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 Max. Int 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 Get. Mem e Size. Of.

 Ex de criação do tipo e declaração do ponteiro: Type P_mat = ^vetor;

Ex de criação do tipo e declaração do ponteiro: Type P_mat = ^vetor; vetor = array[1. . Max. Int] of integer; matriz = array[1. . 181, 1. . 181]; Var aponta : P_mat; aponta_mat : ^matriz;

 Ex. de alocação dinâmica da memória do vetor: get. Mem(aponta, N * Size.

Ex. de alocação dinâmica da memória do vetor: get. Mem(aponta, N * Size. Of(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]);

 Ex. de alocação dinâmica da memória da matriz: get. Mem(aponta, L * C

Ex. de alocação dinâmica da memória da matriz: get. Mem(aponta, L * C * Size. Of(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]);

 Liberando a memória do vetor free. Mem(aponta, N * Size. Of(integer)); Liberando a

Liberando a memória do vetor free. Mem(aponta, N * Size. Of(integer)); Liberando a memória da matriz free. Mem(aponta_mat, L * C * Size. Of(integer));

 • Leia um número inteiro N e aloque dinamicamente memória para um vetor

• 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.