Linguagem de Programação IIParte IX
Professora: Flávia Balbino da Costa
Conteúdo Programático:
• Revisão (estruturas de decisão e repetição, procedimentos e funções )
• Trabalhando com a Linguagem C• Estrutura de dados homogêneas I - vetores• Estrutura de dados homogêneas II - matrizes• Estrutura de dados heterogêneas – registros• Funções• Ponteiros e alocação dinâmica• Arquivos
Ponteiros e Alocação Dinâmica• Um ponteiro é simplesmente um endereço, ou melhor,
uma variável ponteiro é uma variável cujo objetivo é
armazenar um endereço.
• A denominação de ponteiro vem exatamente da ideia
de que uma variável que armazena um endereço é uma
variável que indica (aponta para) uma outra posição de
memória.
Ponteiros e Alocação Dinâmica• Na linguagem C, para se declarar uma variável ponteiro
devemos também definir qual o tipo do valor que ficará
armazenado na área de memória, cujo endereço será
armazenado pela variável ponteiro.
• O formato da sua declaração é a seguinte: tipo VARIAVEL
Ponteiros e Alocação Dinâmica
• A questão agora é a seguinte: para que precisamos de
uma variável que guarde um endereço de memória?
• A resposta então é a seguinte: em diversos tipos de
aplicações, temos que lidar um conjunto de dados que
não sabemos a sua quantidade e, na maioria das vezes,
simplesmente não há um limite máximo!
Ponteiros e Alocação Dinâmica
• Já estudamos que, quando queremos armazenar um
conjunto grande de informações em nosso programa, a
saída é trabalharmos com vetores.
• No entanto, o tamanho de um vetor, pelo menos na
forma que vimos até o momento, é definido no instante
em que o programa está sendo escrito e, nesses casos
citados, a quantidade de valores só passa a ser conhecida
no momento em que o programa já está sendo
executado!
Ponteiros e Alocação Dinâmica• A solução para esse impasse é exatamente reservar a
área de memória no instante da execução do programa.
• Tal prática, permitida na maioria das linguagens
utilizadas atualmente, é conhecida como alocação
dinâmica.
• A alocação dinâmica consiste em reservar espaço na
memória através de comandos à medida que se houver
a necessidade de se armazenar mais informações em
seu programa.
Ponteiros e Alocação Dinâmica• O limite é, obviamente, a quantidade de memória física
disponível na máquina.
• Só que tais áreas de memórias nem sempre serão as
mesmas a cada execução do programa.
• Portanto, para a aplicação correta de tal técnica, ao se
reservar uma área de memória, temos que guardar em
que local da memória (ou seja, o endereço) ficará tal
área. E para guardar endereço o que temos? Resposta:
variáveis ponteiros.
Ponteiros e Alocação Dinâmica
• Em C, como existe a relação, já citada, de vetores com
endereços, é muito mais comum a utilização de vetores
dinâmicos, isto é, vetores que terão o seu tamanho
determinado durante a execução do seu programa.
• O tamanho inclusive poderá ser o valor de uma variável
inteira, já que a reserva de espaço será feita através de
um comando.
Ponteiros e Alocação Dinâmica
• Para se reservar uma área de memória em C, temos o
comando malloc, da biblioteca stdlib.h, cujo objetivo é
reservar uma área de memória do tamanho em bytes
determinado pelo programador.
• A sua utilização é, normalmente feita do seguinte modo:
tipo VAR;...VAR = (tipo ) malloc (n sizeof(tipo));
Ponteiros e Alocação Dinâmica
Onde:
• tipo é: o tipo de cada elemento do vetor;
• n é o tamanho do vetor.
• A função sizeof é uma função do C para obter quantos
bytes uma variável (neste caso, um elemento do vetor)
do tipo especificado entre parênteses ocupará na
memória.
Ponteiros e Alocação Dinâmica
• Tal operação, sendo realizada com sucesso, reserva uma
área de memória cujo endereço inicial será armazenado
em VAR.
• Portanto, o mesmo significado de vetor. Deste modo,
VAR poderá ser utilizada normalmente como um vetor
de tamanho n.
Ponteiros e Alocação Dinâmica
• Um detalhe importante é que nem sempre poderá
haver uma área de memória do tamanho que se deseja
disponível para ser reservada.
• Se isto ocorrer, o comando malloc atribui a VAR a
indicação de endereço nulo, que em C é representado
pela constante NULL. Portanto, é sempre conveniente
testarmos, após a chamada de um comando malloc, se a
variável VAR é igual a NULL.
Ponteiros e Alocação Dinâmica
• Veja a seguir como normalmente isto é feito:
tipo VAR;...VAR = (tipo ) malloc (n sizeof(tipo));if (VAR == NULL) {
Tratamento de erro...
}
Ponteiros e Alocação Dinâmica
• ou de forma simplificada:
tipo VAR;...if ( (VAR = (tipo ) malloc (n sizeof(tipo))) == NULL) {
Tratamento de erro...
}
Ponteiros e Alocação Dinâmica
• Outro detalhe do qual devemos lembrar é que em
alocação dinâmica, do mesmo modo que alocamos
memória a medida que for necessário, devemos liberar
as áreas de memória que não forem mais necessárias.
Ponteiros e Alocação Dinâmica
• Isto é feito através do comando free, simplesmente do
seguinte modo:
free(VAR);
• Onde VAR é variável que recebeu o resultado do
comando malloc, caso a alocação tenha sido feita com
sucesso, é claro.
Ponteiros e Alocação Dinâmica
• Vejamos a seguir dois exemplos da utilização de vetor
dinâmico, similares aos já vistos anteriormente com
vetor estático, e reparem como a sua utilização, após a
sua criação, é idêntica à de um vetor estático.
Exemplo 1:
• Faça um programa em C que leia inicialmente a
quantidade de alunos de uma turma, depois as notas de
cada aluno desta turma e informe a sua média,
utilizando uma função para o cálculo da média.
Solução – parte 1:
Solução – parte 2:
Exemplo 2:
• Faça um programa em C que leia inicialmente a
quantidade de alunos de uma turma, depois leia os
nomes e as notas das duas provas de cada aluno, calcule
a média de cada um deles e liste na tela todos os dados
de todos os alunos em ordem alfabética crescente.
Utilize uma função para fazer a ordenação do vetor.
Solução – parte 1:
Solução – parte 2:
Solução – parte 3:
Solução – parte 4:
Exercícios:1) Um determinado paciente permaneceu internado em
um hospital em um período de tempo. Durante sua
internação vários procedimentos foram efetuados.
Para cada procedimento, as seguintes informações
foram armazenadas no sistema:
• Nome do procedimento;• Valor do procedimento;• Tempo de execução do procedimento (em dias);
Exercícios:Faça um programa em C que leia inicialmente a
quantidade de procedimentos que foram realizados.
Depois apresente como resultado:
a) As informações de cada procedimento (mostrar
normalmente);
b) A quantidade total de dias que ele ficou internado; e
c) O valor total que ele deverá pagar no momento de sua
alta.
•OBS: Utilize duas funções para calcular os totais de a e b.