Ponteiros

Propaganda
 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.
Download