Buscar

Aula 7 - Alocação Dinâmica Parte IV

Prévia do material em texto

Laboratório de 
Programação
Alocação Dinâmica - Parte IV
Ponteiros em Pascal
Prof. Daniel Vecchiato
daniel@ic.ufmt.br
terça-feira, 26 de março de 2013
Conteúdo Abordado
• Tipo de dados;
• Algoritmos em C e Pascal;
• Estruturas de controle;
• Estruturas de repetição;
• Variáveis compostas homogêneas;
• Variáveis compostas heterogêneas;
• Modularização: Blocos e Subprogramas;
• Parâmetros e formas de passagem;
• Recursividade;
• Operações com Arquivos.
terça-feira, 26 de março de 2013
Conteúdo a ser 
abordado
• Ponteiros;
• Alocação dinâmica;
• Estruturas de dados dinâmicas: listas 
lineares;
• Métodos simples de ordenação e pesquisa 
de dados.
terça-feira, 26 de março de 2013
Agenda
• Revisão;
• Ponteiros em Pascal;
• Alocação dinâmica de Vetor;
• Alocação dinâmica de Matriz;
• Exercícios.
terça-feira, 26 de março de 2013
Revisão
Alocação Dinâmica
• Na biblioteca stdlib.h existem duas funções 
para fazer alocação de memória.
• calloc: Nesta função são passados como 
parâmetro o número de blocos de memória a 
serem alocados e o tamanho em bytes de 
cada bloco.
• malloc: Nesta função é passado um único 
argumento, o número de bytes a serem 
alocados.
terça-feira, 26 de março de 2013
Revisão
Alocação Dinâmica
• calloc
• malloc:
terça-feira, 26 de março de 2013
Revisão
Alocação Dinâmica
• Diferenças: O calloc zera todos os bits 
da memória alocada enquanto o malloc 
não. Logo se não for desejável uma 
inicialização (com zero) da memória 
alocada, o malloc é preferível por ser um 
pouco mais rápido.
terça-feira, 26 de março de 2013
Revisão
Alocação Dinâmica
• Além do calloc e do malloc, existe a 
função free na biblioteca stdlib.h
• free: Esta função recebe como 
parâmetro um ponteiro, e libera a 
memória previamente alocada.
• TODA memória alocada durante a 
execução de um programa, deve ser 
desalocada quando não for mais utilizada.
terça-feira, 26 de março de 2013
Revisão
Ponteiros para ponteiros
• Uma matriz pode ser criada utilizando 
ponteiros para ponteiros, no exemplo 
abaixo uma matriz 5x3 é criada:
terça-feira, 26 de março de 2013
Revisão
Ponteiros para ponteiros
terça-feira, 26 de março de 2013
Ponteiros em Pascal
• Variáveis ponteiros são aquelas que 
guardam o endereço de outra variável.
• Declaração em pascal:
var
 ptInt: ^integer;
 ptReal: ^real;
terça-feira, 26 de março de 2013
Ponteiros em Pascal
• Operador @ retorna o endereço de uma 
variável.
terça-feira, 26 de março de 2013
Ponteiros em Pascal
Exercício
• Escreva o programa abaixo em Pascal
terça-feira, 26 de março de 2013
Ponteiros em Pascal
procedure New()
• Cria dinamicamente uma nova variável e faz 
um ponteiro apontar para ela.
terça-feira, 26 de março de 2013
Ponteiros em Pascal
procedure Dispose()
• Libera a memória da variável criada 
dinamicamente.
terça-feira, 26 de março de 2013
Ponteiros em Pascal
procedure Dispose()
• Sempre que um espaço de memória for 
alocado dinamicamente, ele tem que ser 
liberado explicitamente.
• Cada new deve corresponder a um 
dispose.
terça-feira, 26 de março de 2013
Ponteiros em Pascal
Cópia de valores
• Um ponteiro pode receber o valor de um 
outro através do comando de atribuição:
• Quando isso acontece, ele passa a apontar 
para mesma região de memória que o 
outro aponta.
pontA := pontB;
terça-feira, 26 de março de 2013
Ponteiros em Pascal
Cópia de valores
• Qual a saida do programa abaixo?
terça-feira, 26 de março de 2013
Ponteiros em Pascal
Cópia de valores
• Repare que na linha circulada a variável criada perdeu 
a referência.
terça-feira, 26 de março de 2013
Ponteiros em Pascal
Exercício
• 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.
terça-feira, 26 de março de 2013
Alocação Dinâmica
procedure getMem
• A procedure getMem pode ser utilizada 
para alocar dinamicamente espaço de 
memória para uma variável.
• O tamanho a ser criado é especificado pelo 
programador.
• Sintaxe:
• getMem(ponteiro, numero_de_bytes);
Obs: Em Pascal também existe a função sizeOf(tipo)
terça-feira, 26 de março de 2013
Alocação Dinâmica
procedure freeMem
• Para liberar memória de uma variável 
criada dinamicamente, usa-se freeMem.
• Sintaxe:
• freeMem(ponteiro, numero_de_bytes);
Obs: freeMem deve ser usada em conjunto com getMem
terça-feira, 26 de março de 2013
Alocação Dinâmica
Vetores e Matrizes
• Exemplo de criação e declaração do 
ponteiro:
Type
 vetor = array[1..MaxInt] of integer;
 matriz = array[1..181, 1..181];
Var
 aponta_vet : ^vetor;
 aponta_mat : ^matriz;
terça-feira, 26 de março de 2013
Alocação Dinâmica
Vetores e Matrizes
• Exemplo de alocação dinâmica para 
vetores:
• Exemplo de utilização dos elementos do 
vetor:
for x:=1 to N do
 writeln(ponteiro^[x]);
getMem(ponteiro, N * sizeof(integer));
terça-feira, 26 de março de 2013
Alocação Dinâmica
Vetores e Matrizes
• Exemplo de alocação dinâmica para 
matrizes:
• Exemplo de utilização dos elementos da 
matriz:
for x:=1 to L do
 for y:=1 to C do
 writeln(ponteiro^[x,y]);
getMem(ponteiro, L * C * sizeof(integer));
terça-feira, 26 de março de 2013
Alocação Dinâmica
Vetores e Matrizes
• Exemplo de liberação de memória do 
vetor:
• Exemplo de liberação de memória da 
matriz:
freeMem(ponteiro, N * sizeof(integer));
freeMem(ponteiro, L * C * sizeof(integer));
terça-feira, 26 de março de 2013
Alocação Dinâmica
Exercícios
• Escreva um programa que leia do usuário o 
tamanho do vetor a ser alocado, em 
seguida leia os valores do vetor. Após o 
término da leitura, escreva na tela os 
valores contidos no vetor.
• Faça o exercício anterior porém lendo do 
usuário o número de linhas e colunas de 
uma matriz.
terça-feira, 26 de março de 2013

Outros materiais