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 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 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 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 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 por vez. 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). 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. 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. 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) 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). 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 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 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. 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; 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]); 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]); Liberando a memória do vetor freeMem(aponta,N * SizeOf(integer)); Liberando a memória da matriz freeMem(aponta_mat, L * C * SizeOf(integer)); • 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.