Você está na página 1de 18

ESTADO DE MATO GROSSO SECRETARIA DE ESTADO DE CINCIA E TECNOLOGIA UNIVERSIDADE DO ESTADO DE MATO GROSSO CAMPUS UNIVERSITRIO "DEP. EST.

REN BARBOUR FACULDADE DE CINCIAS EXATAS DEPARTAMENTO DE CINCIA DA COMPUTAO

PONTEIROS
Prof. Luciano

Organizao da Memria
Memria do Sistema

Variveis Dinmicas Variveis Locais

Variveis Globais
Instrues do Programa

Heap: a regio de memria livre que seu programa pode usar, via funes de alocao dinmica, em aplicaes onde no conhecemos previamente a quantidade de memria que ser utilizada em vetores, matrizes, listas encadeadas ou rvores.

Alocao de memria

Todas as variveis GLOBAIS declaradas at agora (var. simples, vetores, registros, etc.) so ESTTICAS, isto , a memria alocada pra elas do comeo ao fim do programa. As variveis LOCAIS, tambm ESTTICAS, tm seu espao alocado quando da chamada funo ou ao procedimento e so liberadas no final deles tamanho pr-fixado. A diferena das variveis DINMICAS que voc pode alocar e dispor de espao durante a execuo do programa.

Alocao Dinmica de Memria

As variveis dinmicas no podem ser referenciadas diretamente mas somente associadas a uma varivel comum de um tipo qualquer. Estas variveis so chamadas de ponteiros, isto , variveis cujo contedo no um dado relacionado com o problema que est sendo resolvido, mas um endereo de algum outro dado (objeto) do problema.

Declarao

var identificador : ^tipo; O smbolo ^ indica que o identificador um ponteiro Exemplo: p : ^integer; Isso indica que teremos um ponteiro com o nome de p com a capacidade de armazenar o endereo de memria de uma varivel do tipo integer A varivel criada no aponta para lugar algum (NIL)

Criar a varivel dinmica

New(p); Isto faz com que seja alocado um espao de memria, suficiente para armazenar uma varivel do tipo associado a p, no caso Integer

Exemplo
New(p); If p = Nil Then WriteLn('ERRO: Falta de Memria') Else WriteLn('Ok, Ponteiro Alocado');

Acesso as variveis dinmicas

Sintaxe: identificador^ Exemplo p^ := 20;

Exemplo
Program Exemplo1; Uses CRT; Type Ponteiro = ^Integer; Var p : Ponteiro; i : Integer; Begin ClrScr; If p = NIL Then Writeln('sim'); New(p); p^:=100; Writeln(p^); i:=200; p^:=i; Writeln(p^); p:=addr(i); {* ou p:=@i; - o pointer contm agora o endereo da varivel i *} p^:=1000; Writeln(i); Readkey; End.

Procedures para ponteiros

Dispose: procedimento que desaloca a memria alocada pelo procedimento New(p). Ex.: Dispose(p); Mark: permitem atribuir, a uma varivel do tipo Pointer, o valor atual do apontador do topo do HEAP. Ex.: Mark (p); Release: permite alterar o valor do apontador do topo do HEAP. Ex.: Release(p);

GetMem
GetMan: procedimento que aloca uma rea com "n" bytes Sintaxe: GetMem(p,nmero_de_bytes); Onde p o ponteiro e nmero_de_bytes um inteiro.

Exemplo
Program exemplo; Uses Crt; Var P: ^Integer; N: Byte; Num_Bytes: Word; Begin ClrScr; Write("Nmero de Elementos: '); ReadLn(N); Num_Bytes := N * SizeOf(Integer); {* Calcula o Nmero de Bytes *} GetMem(P,Num_Bytes); If P = Nil Then WriteLn('ERRO: Falta de Memria') Else WriteLn('Ok, Ponteiro Alocado'); End.

FreeMem
Procedimento que desaloca uma rea com n bytes Sintaxe: FreeMem(p,nmero_de_bytes);

Estrutura de dados com ponteiro

Este programa l registros com a estrutura abaixo, at que se digite 'fim' quando perguntado o nome da pessoa. Repare que o programa tem a capacidade de ler um nmero ilimitado de registros sem a preocupao de se definir um array e sua respectiva dimenso. Exemplo...

Definies

P Contm o endereo de memria apontada pelo ponteiro p^ Contm o contedo do ponteiro @n Contm o endereo da varivel n

Criar um programa em Pascal que permite acessar o contedo da memria tanto pelo nome da varivel, quanto pelo seu endereo.

program pram; uses crt; var num1, num2 : byte; letra1, letra2, letra3 : char; pnum1, pnum2: ^byte; pletra1, pletra2, pletra3 : ^char;

begin clrscr;

{Acesso a memoria pelos nomes}


pnum1 := addr(num1); pnum2 := addr(num2); pletra1 := addr(letra1); pletra2 := addr(letra2); pletra3 := addr(letra3); writeln; {ou pnum := @num1;}

{Atribuindo valores as variaveis} num1 := 1; num2 := 200; letra1 := 'A'; letra2 := 'B'; letra3 := 'C'; writeln;

{Acessando a RAM pelos nomes e por seus enderecos} writeln('Acessando a RAM pelos nomes e por seus enderecos'); writeln(num1,' = ',pnum1^); writeln(num2,' = ',pnum2^); writeln(letra1,' = ',pletra1^); writeln(letra2,' = ',pletra2^); writeln(letra3,' = ',pletra3^); writeln;

{Escrevendo os enderecos onde os conteudos estao armazenados} writeln('Escrevendo os enderecos onde os conteudos estao armazenados'); writeln(longint(pnum1)); writeln(longint(pnum2)); writeln(longint(pletra1)); writeln(longint(pletra2)); writeln(longint(pletra3));
readkey; end.

Você também pode gostar