Sunteți pe pagina 1din 21

Alocao Dinmica e Apontadores

Cludio E. C. Campelo http://claudiocampelo.com

Alocao Esttica x Dinmica


Linguagens de programao como Pascal, C e C++ permitem dois tipos de alocao de memria: esttica e dinmica; Na alocao esttica, o espao de memria para as variveis reservado no incio da execuo, no podendo ser alterado depois;
int a; int b[20];

Na alocao dinmica, o espao de memria para as variveis pode ser alocado dinamicamente durante a execuo do programa;

Alocao Esttica x Dinmica


Em alocao esttica, a quantidade total de memria utilizada pelos dados previamente conhecida e definida de modo imutvel; de outra forma, diz-se que a alocao dinmica. A forma mais natural de armazenar uma lista dentro do computador a alocao seqencial

Alocao Esttica x Dinmica


A maior vantagem no uso de uma rea seqencial de memria que, dado o endereo inicial da rea alocada e o ndice de um elemento qualquer da lista, podemos acess-lo imediatamente, com um simples e rpido clculo. O grande problema est em no poder redimensionar o uso de memria de uma estrutura, ou seja, deve ser conhecido previamente e de tamanho imutvel.

Alocao Esttica x Dinmica


O ponto fraco da alocao esttica aparece quando precisamos inserir ou apagar elementos no meio do vetor, o vetor deve ser rearranjado; A diferena da alocao seqencial dinmica em relao esttica est somente na possibilidade da dinmica poder redimensionar o uso da memria, se necessrio.

Alocao Dinmica
A memria alocada dinamicamente acessada atravs de Apontadores (pointers), que na verdade so variveis que armazenam o endereo de uma rea de memria; A memria alocada dinamicamente faz parte de uma rea de memria chamada de heap;
Durante a execuo, o programa aloca e desaloca pores de memria do heap;

Alocao Dinmica

Apontadores Notao em C

Alocao Dinmica

Alocao Dinmica - Erros Comuns


Esquecer de alocar memria e querer acessar o contedo da varivel; Copiar o valor do apontador ao invs do valor da varivel apontada; Esquecer de desalocar memria
Ela desalocada ao fim do programa, procedimento ou funo onde a varivel est declarada, mas pode ser um problema em loops

Tentar acessar o contedo da varivel depois de desaloc-la;

Alocao Dinmica
Exerccio: o que vai ser impresso?

Apontadores para tipos estruturados


Apontadores so normalmente utilizados com tipos estruturados

Passagem de Parmetros
Em Pascal e C++, parmetros para funo podem ser passados por valor ou por referncia;
Em pascal, um define-se que a passagem de um parmetro por referncia utilizando a palavra var antes do parmetro;

Por valor: o parmetro formal (recebido como parmetro) uma cpia do parmetro real (passado na chamada); Por referncia: o parmetro formal (recebido como parmetro) uma referncia do parmetro real (passado na chamada);
As modificaes efetuadas acontecem no parmetro real;

Em C s existe passagem por valor, logo deve-se utilizar a passagem por referncia utilizando-se apontadores;

Passagem de Parmetros

Apontadores Notao em Pascal


Em Pascal, o funcionamento de ponteiros parecido com o do pseudocdigo. Declarao:
var varivel: ^tipo;

Operador de endereo:@ Ponteiro nulo: nil; Operador de contedo:^

Ponteiros em Pascal Exemplo 1

var x:integer; p,q:^integer; x := 10; p := @x; q := p; q^ := p^ + 10; writeln('Resultado = ,p^);

Resultado = 20

Ponteiros em Pascal Exemplo 2

type pont_rec = ^rec; rec = record dado: real; pont: pont_rec; end; var x,x1:rec; p,q : pont_rec;

Ponteiros em Pascal Exemplo 2


var x,x1:rec; p,q :pont_rec; x.valor := 10.5; p := @x; x.pont := @x1; x1.valor := 0.2; q := x.pont; x1.pont := nil;

writeln(p^.valor) writeln(q^.valor) writeln(p^.pont^.valor) writeln(x.valor) writeln(x.pont^.valor) writeln(x1.valor)

10.5 0.2 0.2 10.5 0.2 0.2

Ponteiros em Pascal Alocando espao na Heap


Em Pascal, a operao que aloca memria implementada por uma funo, na forma:
new(p); que tem o mesmo efeito da operao reserve do pseudo-cdigo.

Em Pascal, a operao que libera memria implementada por uma funo, na forma:
dispose(p); que tem o mesmo efeito da operao libere do pseudocdigo.

Ponteiros em Pascal Exemplo 3


var p,q:^integer; new(p); p^ := 10; q := p; q^ := p^ + 10; writeln("Resultado = ",p^); dispose(p); q := nil;

Resultado = 20

Referncias Bibliogrficas
Rosane Minghim. Curso de Introduo Cincia da Computao. ICMC/USP. www.icmc.usp.br/~sce6001/aulas/aula18_ponteiros_pascal_2005.pd f Alexandre Rossini. Curso de Estrutura De Dados. Universidade Catlica de Tocantins. http://si.catolica-to.edu.br/documentos/02020997/Aula%204.pdf Jussara Almeida . Curso de Algoritmos e Estruturas de Dados II. DCC/UFMG. http://www2.dcc.ufmg.br/disciplinas/aeds2_turmaA1/alocacaodinamica.pdf

S-ar putea să vă placă și