You are on page 1of 45

Unidade VI

LINGUAGEM E TCNICAS DE PROGRAMAO

Profa. Vanessa Lessa


Objetivo

Alocao dinmica de memria.


Alocao dinmica de memria

Ao declarar um vetor, para dimension-lo era necessrio saber


de antemo quantos elementos iriam comp-lo. Tnhamos de
prever o nmero mximo de elementos no vetor durante o
processo da codificao. O pr-dimensionamento do vetor
um fator que limita a programao. Uma soluo seria
superdimensionar o vetor para tentar contornar essa falta
de elementos livres durante a execuo do programa, mas
isso acarreta um desperdcio de memria, o que inaceitvel
em diversas aplicaes, como aplicativos portteis, em que
sempre estamos sujeitos a ter falta de memria.
A linguagem C oferece meios de utilizar e racionalizar
o uso da memria durante a execuo do programa, ou seja,
podemos alocar memria dinamicamente. Este recurso
permite ao programa alocar elementos ou registros
dinamicamente, sem desperdcio de memria.
O uso da memria

Basicamente, existem trs maneiras de reservarmos espao


de memria para o armazenamento de informaes sem
o rigor tcnico.
A primeira maneira por meio do uso de variveis globais
(e estticas). Nessa categoria de variveis, o espao
reservado para uma varivel existir enquanto o programa
estiver sendo executado.
O uso da memria

A segunda maneira usando variveis locais. Nessa categoria,


o espao na memria existe apenas no perodo em que a
funo que declarou a varivel est sendo executada, sendo
liberado assim que a execuo da funo terminar. Como
consequncia, a funo que chama no pode fazer referncia
ao espao local da funo chamada. As variveis globais
ou as locais podem ser simples ou vetores. Para os vetores,
necessrio informar o nmero mximo de elementos,
caso contrrio o compilador no ter a informao sobre o
tamanho do espao a ser reservado.
A terceira maneira de reservar a memria solicitar ao
programa que aloque dinamicamente um espao na memria
durante sua execuo. Esse espao permanece reservado
at que seja liberado explicitamente pelo programa, por
meio de comando especfico.
O uso da memria

Ao colocarmos um programa para ser executado, o sistema


operacional carregar o cdigo compilado na memria.
Uma vez com o cdigo na memria, o sistema passa a ser
comandado pelo programa. A primeira etapa reservar o
espao para as constantes e as variveis globais, pois essas
so estticas, ou seja, no sero criadas constantes nem
variveis globais durante a execuo do resto do programa.
O uso da memria

Cada vez que uma determinada funo chamada, o sistema


reserva o espao necessrio para as variveis locais da funo.
Simultaneamente, a pilha do controle da chamada das funes
armazena a sequncia de chamada e o estado geral das
memrias operacionais. Conforme as funes so chamadas,
a memria livre cresce e a pilha atualizada. Quando as funes
so encerradas, o sistema consulta na pilha o ponto em que
a funo foi chamada, retornando o programa nesse ponto
e liberando o espao das variveis e da pilha, criados
dinamicamente:
Ponteiro de variveis

Cada vez que uma varivel declarada, um espao alocado


na memria para armazenar valores. Tecnicamente, feito
mais do que a simples reserva. O programa tem uma tabela
em que armazena o nome da varivel, o endereo e o tipo de
valor que ser armazenado. Assim, ao escrevermos int a;, o
programa reserva um espao, normalmente de 4 bytes, por ser
inteiro, no primeiro espao livre da memria que encontrar.
Em seguida, cria uma linha em uma tabela, na qual armazena o
endereo e o tipo associado varivel criada nesse momento.
Ponteiro de variveis

A linguagem C tem uma maneira especial de uma varivel


armazenar endereos. Essa varivel se chama varivel ponteiro
ou simplesmente ponteiro. A declarao de uma varivel feita
da seguinte forma:

Por exemplo:

O programa reserva um espao na memria para uma varivel


chamada p, que ir guardar um endereo e esse endereo
armazenado conter uma informao do tipo inteiro. O smbolo
* identifica que uma varivel do tipo ponteiro.
Ponteiro de variveis

Para acessar os endereos de memria, a linguagem oferece


dois operadores unrios:
& (endereo de), aplicado a variveis, resulta no endereo
da posio da memria reservada para a varivel;
* (contedo de), aplicado a variveis do tipo ponteiro, acessa
o contedo do endereo de memria armazenado
pela varivel ponteiro.
Ponteiro de variveis

Fonte: Livro-texto.
Interatividade

Desenvolva o teste de mesa para o programa abaixo e assinale


qual a alternativa que apresenta a sada correta:
a) 3 4.
b) 4 3.
c) 5 4.
d) 4 5.
e) 3 5.
Passagem de valores por valor e por referncia

Quando estudamos funes, vimos que, quando passamos


informaes para dentro de uma funo, fazemos isso por
meio de parmetros. Tambm foi dito que uma funo aquela
que devolve um e apenas um valor, ou seja, no devolve mais
de um valor. O uso de ponteiros amplia a possibilidade de
utilizao dos parmetros e soluo de problemas de
retornos mltiplos.
Dizemos que h uma passagem de parmetros por valor quando
contedos (e no endereos) so passados para as funes.
Passagem de valores por valor e por referncia

A seguir, os valores de a e b so passados para a funo


troca:

Fonte: Livro-texto.
Passagem de valores por valor e por referncia

Quando os parmetros passados so endereos, dizemos que


foram passados por referncia:

Fonte: Livro-texto.
Passagem de valores por valor e por referncia

Passagem de valores por valor:

Fonte: Livro-texto.
Passagem de valores por valor e por referncia

Passagem de valores por valor:

Fonte: Livro-texto.
Passagem de valores por valor e por referncia

Passagem de valores por valor:

Fonte: Livro-texto.
Passagem de valores por valor e por referncia

Passagem de valores por valor:

Fonte: Livro-texto.
Interatividade

Desenvolva o teste de mesa para o programa abaixo e assinale a


alternativa que apresenta a sada correta:
a) Calculado 1 e 2 eh 3.
b) Calculado 10 e 5 eh 3.
c) Calculado 5 e 3 eh 2.
d) Calculado 7 e 3 eh 10.
e) Calculado 9 e 8 eh 72.
Passagem de valores por valor e por referncia

Passagem de valores por referncia:

Fonte: Livro-texto.
Passagem de valores por valor e por referncia

Passagem de valores por referncia:

Fonte: Livro-texto.
Passagem de vetores para funes

A linguagem C no passa vetores como parmetros de


funo; assim, a maneira que temos para fazer isso
passando o endereo da primeira posio do vetor.
Dessa forma, para receber um vetor, devemos colocar
uma declarao do mesmo tipo do vetor, com a indicao
de que um ponteiro (usando o *).
Passagem de vetores para funes

Exemplo:

Fonte: Livro-texto.
Funes da biblioteca-padro

Muitas vezes, o uso de vetores e matrizes fica limitado pela


necessidade de sabermos antecipadamente a quantidade
de elementos que sero necessrios. O interessante seria
termos condies de criar e destruir elementos sem a
limitao (apenas da mquina e no da lgica), conforme
fossem surgindo as necessidades de uso.
A biblioteca stdlb.h possui algumas funes que nos permitem
criar e trabalhar dinamicamente, ou seja, durante
a execuo de um certo trecho do programa. Para isso,
precisamos entender algumas funes e utilizar os
conhecimentos do uso da memria que vimos at agora.
Funes da biblioteca-padro

equivalente a simplesmente declararmos:

Fonte: Livro-texto.
Funes da biblioteca-padro

equivalente a simplesmente declararmos:


A primeira funo o malloc(int), memory allocation ou
alocao de memria. A funo malloc reserva a quantidade
de bytes que passada como parmetro e retorna o endereo
em que esse espao de memria foi reservado. Assim, se
quisermos reservar o espao de dez elementos inteiros para
um vetor, imaginando que cada elemento de inteiro use 2
bytes (esse um nmero puramente fictcio, pois cada
compilador pode ter um tamanho diferente), poderemos
reservar 20 bytes de memria.

Fonte: Livro-texto.
Funes da biblioteca-padro

equivalente a simplesmente declararmos:

Fonte: Livro-texto.
Funes da biblioteca-padro

equivalente a simplesmente declararmos:


v um ponteiro inteiro e esse espao alocado no corresponde
ao de inteiro. Vamos usar um item chamado converso de
tipos, o chamado cast. Agora isso ser til, pois transforma
qualquer coisa em um tipo de varivel. Nesse caso, servir
para formatar ou adequar o espao alocado. Como o tipo de v
um ponteiro inteiro, aplicaremos a converso do tipo int *.

Fonte: Livro-texto.
Funes da biblioteca-padro

equivalente a simplesmente declararmos:

Fonte: Livro-texto.
Funes da biblioteca-padro

equivalente a simplesmente declararmos:


Para liberar um espao de memria alocado dinamicamente,
utiliza-se a funo free da biblioteca sdtilb.h. Essa funo
recebe como parmetro o ponteiro da memria a ser liberada e o
espao alocado liberado para outros usos futuros. Assim,
para liberar o vetor v, fazemos:

Fonte: Livro-texto.
Interatividade

Desenvolva o teste de mesa para o programa abaixo e assinale


qual a alternativa que apresenta a sada correta:
a) 0.
b) 50.
c) 100.
d) 150.
e) 200.
Recursividade

A recursividade a possibilidade de uma funo se chamar,


ou, ento, voltar a ser chamada aps a execuo de funes
que ela mesma chamou. Isso quer dizer que, a cada chamada,
o programa abre um novo espao na memria para a sua
execuo. A cada chamada recursiva guardada uma cpia
dos parmetros, de modo que no percamos os valores dos
parmetros das chamadas anteriores. Em princpio, enquanto
houver memria para a recursividade, a funo poder
ser reutilizada.
Recursividade

As funes recursivas tm duas caractersticas importantes:


ponto de parada: geralmente, um limite superior ou inferior
da regra geral;
regra geral: reduz a resoluo do problema por meio da
invocao recursiva de casos menores, resolvidos mediante
a resoluo de casos ainda menores e assim sucessivamente,
at atingir o ponto de parada, que finaliza o mtodo.
As funes que no so recursivas so chamadas de iterativas.
Recursividade

Exemplo: multiplicao de inteiros:

Fonte: Livro-texto.
Recursividade

Exemplo: multiplicao de inteiros.

Fonte: Livro-texto.
Recursividade

Exemplo: multiplicao de inteiros.

Fonte: Livro-texto.
Recursividade

Exemplo: multiplicao de inteiros.

Fonte: Livro-texto.
Recursividade

Fonte: Livro-texto.
Recursividade

Fonte: Livro texto


Recursividade

Fonte: Livro-texto.
Recursividade

Fonte: Livro-texto.
Recursividade

Fonte: Livro-texto.
Interatividade

Desenvolva o teste de mesa para o programa abaixo e assinale


qual a alternativa que apresenta a sada correta:
a) Entrada 1 e Sada 0.
b) Entrada 3 e Sada 9.
c) Entrada 4 e Sada 18.
d) Entrada 5 e Sada 120.
e) Entrada 6 e Sada 120.
AT A PRXIMA!

You might also like