Buscar

Aula 4 - Alocação Dinâmica Parte I

Prévia do material em texto

Laboratório de 
Programação
Alocação Dinâmica - Parte I
Prof. Daniel Vecchiato
daniel@ic.ufmt.br
sexta-feira, 15 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.
sexta-feira, 15 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.
sexta-feira, 15 de março de 2013
Agenda
• Revisão;
• Ponteiro;
• Passagem de parâmetro;
• Ponteiros e Vetores;
• Exercícios;
• Resumo.
sexta-feira, 15 de março de 2013
Revisão
• Quais funções são utilizadas para ler/
escrever em um arquivo texto em Pascal?
• Quais funções são utilizadas para ler/
escrever em um arquivo binário em 
Pascal?
• Qual função é utilizada para acesso não 
sequencial em Pascal?
sexta-feira, 15 de março de 2013
Revisão
Arquivos Textos em C
• Crie um ponteiro para o arquivo: FILE *parq;
• Abra o arquivo de modo apropriado associando-o a um ponteiro:
• parq = fopen(“nomeArquivo”, “modo”);
• Leia dados do arquivo na memória usando fscanf:
• fscanf(parq, string-tipo-variavel, &variavel);
• Dados podem ser lidos até EOF.
• Altere dados se necessário e escreva-o novamente em arquivo:
• fprintf(parq, string-tipo-variavel, variavel);
• Todo arquivo deve ser fechado:
• fclose(parq);
sexta-feira, 15 de março de 2013
Revisão
Arquivos Binários em C
• Crie um ponteiro para o arquivo: FILE *parq;
• Abra o arquivo de modo apropriado associando-o a um ponteiro:
• parq = fopen(“nomeArquivo”, “modo”);
• Leia dados do arquivo na memória usando fread:
• fread(*pt-mem, tamanho, qtde, *arquivo);
• Escreva dados no arquivo usando fwrite:
• fwrite(*pt-mem, tamanho, qtde, *arquivo);
• Todo arquivo deve ser fechado:
• fclose(parq).
sexta-feira, 15 de março de 2013
Revisão
Arquivos Binários em C
• Para acesso não sequencial use fseek:
• fseek(*arquivo, num_bytes, origem);
• O deslocamento pode ser relativo ao:
• inicio do arquivo (SEEK_SET);
• ponto atual (SEEK_CUR);
• final do arquivo (SEEK_END).
sexta-feira, 15 de março de 2013
Revisão
Manipulação de Arquivos em Pascal
Nome Uso
ASSIGN Vincular arquivo à variável.
REWRITE Criar arquivo. Caso o arquivo exista seus dados serão apagados.
RESET Abrir arquivo.
CLOSE Fechar arquivo. Efetua a gravação dos dados.
ERASE Apaga o arquivo
RENAME Renomeia o arquivo.
READ Ler de arquivo.
WRITE Escrever em arquivo.
SEEK Movimentar ponteiro do arquivo.
FILESIZE Obter número de registros de um arquivo.
FILEPOS Obter a posição do ponteiro do arquivo.
EOF Verifica final do arquivo
sexta-feira, 15 de março de 2013
Ponteiro
• Ponteiros são tipos especiais de dados que 
armazenam endereços de memória.
• Uma variável do tipo ponteiro deve ser 
declarada da seguinte forma:
• A variável ponteiro armazená um endereço de 
memória de uma outra variável do tipo 
especificado
sexta-feira, 15 de março de 2013
Operadores de 
Ponteiro
• Existem dois operadores relacionados a ponteiro:
• O operador & retorna o endereço de memória de uma variável
• O operador * acessa o conteúdo do endereço indicado pelo 
ponteiro
sexta-feira, 15 de março de 2013
Operadores de 
Ponteiro
sexta-feira, 15 de março de 2013
Operadores de 
Ponteiro
sexta-feira, 15 de março de 2013
Cuidado!
• Não se pode atribuir um valor para o endereço apontado 
pelo ponteiro, sem antes ter certeza de que o endereço é 
válido:
• O correto seria:
sexta-feira, 15 de março de 2013
Cuidado!
• O operador * de ponteiros é igual a multiplicação, preste 
atenção como utilizá-lo.
sexta-feira, 15 de março de 2013
Cuidado!
• O operador * de ponteiros é igual a multiplicação, preste 
atenção como utilizá-lo.
Ocorre um erro de compilação pois o * é interpretado como operador de 
ponteiro.
sexta-feira, 15 de março de 2013
Cuidado!
• O correto seria algo como:
sexta-feira, 15 de março de 2013
Cuidado!
• O endereço que um ponteiro armazena é sempre de um 
tipo específico.
• Além do compilador alertar que a atribuição pode causar 
problemas é impresso um valor diferente de 10.89.
sexta-feira, 15 de março de 2013
Operações com 
ponteiros
• Comparações podem ser feitas entre ponteiros ou 
o conteúdo apontado por estes
• Para imprimir um ponteiro usa-se %p
sexta-feira, 15 de março de 2013
Operações com 
ponteiros
• Quando um ponteiro não está associado com nenhum 
endereço válido é comum atribuir o valor NULL para 
este.
• Isto é usado em comparações com ponteiros para saber se 
um determinado ponteiro possui valor válido ou não.
sexta-feira, 15 de março de 2013
Exercício
• XVIII - O que será impresso?
sexta-feira, 15 de março de 2013
Passagem de 
Parâmetros
• Os valores fornecidos como argumentos a uma função são 
copiados para as variáveis parâmetros. Este processo é 
idêntico a uma atribuição. Chamado de passagem por 
valor.
• Alterações nos parâmetros dentro da função não alteram 
os valores que foram passados.
sexta-feira, 15 de março de 2013
Passagem de argumentos 
por referência
• Em C só existe passagem de parâmetros por 
valor.
• Em algumas linguagens existem construções para 
se passar parâmetros por referência.
• Neste último caso, alterações de um 
parâmetro passado por referência também 
ocorrem onde foi feita a chamada da função.
• No exemplo anterior, se x e y fossem passados 
por referência, seu conteúdo seria trocado.
sexta-feira, 15 de março de 2013
Passagem de argumentos 
por referência
• Pode-se obter algo semelhante em C 
utilizando ponteiros.
• O artificio corresponde em passar como 
argumento para uma função o endereço 
da variável, e não o seu valor.
• Desta forma pode-se alterar o conteúdo 
da variável como se fosse feito passagem 
por referência.
sexta-feira, 15 de março de 2013
Passagem de argumentos 
por referência
sexta-feira, 15 de março de 2013
Passagem de argumentos 
por referência
• O uso de ponteiros para passar parâmetros que devem 
ser alterados dentro de uma função é útil em certas 
situações como:
• Funções que precisam retornar mais do que um 
valor.
• Suponha que queremos criar uma função que recebe 
um vetor como parâmetro e precisa retornar o maior 
e menor elemento do vetor.
• Pode-se passar ponteiros para variáveis que 
conterão o maior e menor elemento.
sexta-feira, 15 de março de 2013
Exercício
• XIX - Faça um função que receba por 
parâmetro um vetor de inteiros, tamanho 
do vetor e dois inteiros para serem 
alterados com o valor mínimo e máximo 
do vetor.
sexta-feira, 15 de março de 2013
Passagem de argumentos 
por referência
sexta-feira, 15 de março de 2013
Ponteiros e Vetores
• Quando declaramos uma variável do tipo 
vetor, é alocado uma quantidade de 
memória contigua cujo tamanho é 
especificado na declaração (e também 
depende do tipo do vetor).
• int a[5]: Será alocado 5*4 bytes de 
memória associada com a.
sexta-feira, 15 de março de 2013
Ponteiros e Vetores
• Uma variável vetor, assim como um ponteiro, 
armazena um endereço de memória: O 
endereço de início do vetor.
• int a[5]: A variável a contém o endereço 
de memória do início do vetor.
• Quando passamos um vetor como 
argumento seu conteúdo pode ser alterado 
dentro da função.
sexta-feira, 15 de março de 2013
Exercício
• XX - Faça um programa que contenha uma 
função que recebe um vetor por parâmetro 
e atribuao valor 0 em todos os seus 
elementos.
sexta-feira, 15 de março de 2013
Ponteiros e Vetores
sexta-feira, 15 de março de 2013
Ponteiros e Vetores
• Um vetor pode ser atribuído a um ponteiro:
• Após a atribuição, pode-se usar p como se fosse um vetor:
sexta-feira, 15 de março de 2013
Ponteiros e Vetores: 
Diferenças
• Uma variável vetor, diferentemente de um ponteiro, possui 
um endereço fixo.
• Não se pode atribuir um endereço para uma variável do 
tipo vetor.
sexta-feira, 15 de março de 2013
Ponteiros e Vetores
Diferenças
• Se b for declarado como ponteiro não há 
problemas:
sexta-feira, 15 de março de 2013
Resumo
• Ponteiros armazenam endereço de memória.
• Antes de atribuir um valor a um ponteiro, ele 
deve previamente ter um endereço de memória.
• O operador & retorna o endereço de memória de uma 
variável
• O operador * acessa o conteúdo do endereço indicado pelo 
ponteiro
• Ponteiros podem ser utilizados para simular a 
passagem de parâmetro por referência.
sexta-feira, 15 de março de 2013
Exercício
• XXI - Faça um programa que atribua um 
vetor a um ponteiro de inteiro, utilizando o 
ponteiro inverta o conteúdo do vetor.
sexta-feira, 15 de março de 2013

Continue navegando