C:\>P - A Linguagem_
Página Inicial Mensagem Arquivos Pascal Tutorial Links Pascal Página Pessoal Assinar Book Ver GuestBook
 
Mini-Tutorial

   E então começamos, mais como uma experiência, um tutorial... Vamos abordar assuntos interessantes em Pascal... Que tal começarmos com ponteiros ???

   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 :

+------+------+------+
| Pont | Dado | Pont |
+--|---+------+---|--+
|                             |
+------------------+                            +------------------+
+------+--|---+------+                     +------+---|--+------+
 |Pont | Dado | Pont |                      | Pont | Dado | Pont |
+------+------+------+                     +------+------+------+
 
   Mas isso é assunto para outra ocasião... Ou melhor, faça Ciência da Computação na UnB pra aprender isso !!! :-)

Bibliografia recomendada :

Estruturas de Dados, VILLAS Marcos Vianna e outros autores, editora Campus.
Fundamentals of Data Structures, HOROWITZ Ellis, SAHNI Sartaj, Computer Science Press.


© 1997, Luiz Gustavo Horita
horita@geocities.com