Baixe o app para aproveitar ainda mais
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
Compartilhar