Página Inicial | Mensagem | Arquivos Pascal | Tutorial | Links Pascal | Página Pessoal | Assinar Book | Ver GuestBook |
O que são ponteiros ? Ponteiros são variáveis
de 20 bits que armazenam um endereço na memória. Por exemplo,
posso ter um ponteiro que aponta para uma variável real, ou para
uma String, ou mesmo para um Objeto. E para que servem ? Para muita coisa...
Desde alocação dinâmica de variáveis até
o armazenamento de informações de forma ordenada no caos
da memória...
Antes de tudo, como usar ponteiros ??? Simples... Você
pode declará-los na definição de tipos ou na de variáveis
:
type
TPReal = ^Real;
TPObjt = ^TObjt; {TObjt é um Tipo de ponteiro
que aponta para o objeto}
TObjt = object (ObjetoMae);
Var1, Var2
: Integer;
contructor
Init;
end;
var
PReal : ^Real; {Ou PReal : TPReal, que é a
mesma coisa}
PObjt : TPbjt; {Onde PObjt SIM é o ponteiro
para um objeto na memória}
Numer : Real; {Numer é uma variável
estática que armazena um real}
Ops ! Antes de tudo, qual a diferença entre uma variável dinâmica e uma estática ??? A dinâmica pode ser alocada quando você quiser, com os comandos NEW e DISPOSE. Já a estática não, ela é permanente na memória (A não ser em variáveis locais em procedures, mas é outro caso...). Ah, e daí ? E daí que você pode usar as variáveis dinâmicas como se fossem estáticas, com a difrença de poder se livrar delas quando não precisar mais, liberando assim espaço na memória :
begin
new (PReal); {Inicio a variável dinâmica,
alocando memória para ela}
PReal^ := 3.1416; {Note o uso do circunflexo}
dispose (PReal); {Limpa a memória, liberando-a
para outras aplicações}
end;
É importante notar que o uso do circunflexo (^)
possibilita vc usar o VALOR da variável que está sendo apontada,
pois o ponteiro sem tal sinal representa apenas um endereço na memória.
Ahhhh !!! Há uma característica pouco usada
no Pascal, o operador @. Com ele, vc pode atribuir a um ponteiro o endereço
de uma variável !!! Por exemplo : PReal := @Numer; (O ponteiro
PReal passa a apontar para a variável Numer).
Outra coisa interessante é que os ponteiros apontam
sempre para um tipo determinado de variável, certo ? Errado. Você
pode criar um ponteiro para uma variável não-tipada qualquer
na memória ! Isso é útil quando vc tem um dado em
memória que não sabe o tipo (Um Bitmap por exemplo) e quer
usá-lo dinâmicamente (Até porque um dado desse tipo
não tem outro modo de ser manipulado). Outro ponto importante é
que com tal ponteiro vc não usa NEW e DISPOSE, mas sim GETMEM e
FREEMEM :
var PAlgo : Pointer;
Ah, ok... Já sabemos tudo sobre ponteiros ! Nem tanto... Já deu pra imaginar como eles são úteis, mas lembra-se dos records (Registros) que podem conter todo tipo de dados ? E se lá tivermos um ponteiro para outro registro ??? YES ! É a base da Estrutura de Dados, aonde dados são armazenados em memória de forma organizada, mesmo que não estejam contínuos na memória !!! Ah, um detalhe... Há um valor especial para ponteiro chamado NIL que significa um ponteiro que não aponta para lugar algum. Normalmente é utilizado para indicar o fim de uma lista ou ramo de árvore binária, mas vc pode encontrar outros usos...
Uma lista encadeada :
+------+------+ +------+------+
+------+------+ +------+------+
| Dado | Pont +---> | Dado | Pont +---> | Dado | Pont +---> | Dado
| Pont +---> NIL;
+------+------+ +------+------+
+------+------+ +------+------+
Uma árvore binária :
Bibliografia recomendada :
Estruturas de Dados, VILLAS Marcos Vianna e outros autores, editora
Campus.
Fundamentals of Data Structures, HOROWITZ Ellis, SAHNI Sartaj,
Computer Science Press.