Ponteiros

Pascalzim

Ponteiros

Ponteiros são variáveis que podem armazenar o endereço de uma outra variável.

Declaração de ponteiros


Var nomePonteiro : ^tipoDados ;



O simbolo ^ deve ser lido como o ponteiro para...


Na declaração acima temos que nomePonteiro é um ponteiro para variáveis do tipo tipoDados.



Exemplo


   Var ponteiro: ^integer ;   



Exemplo


   Type TAluno = Record

                   nome: String ;

                   matricula: String ;

                 End ;      


   Var ponteiroAluno: ^TAluno ;



Operações sobre ponteiros


  • Guardar no ponteiro endereço de uma variável:


      ponteiro := @variável ;



  • Guardar no ponteiro o endereço armazenado em um outro ponteiro:


      ponteiro := outroponteiro ;



  • Dizer que o ponteiro não guarda nenhum endereço:


      ponteiro := nil ;



  • Referenciar o dado apontado pelo ponteiro (o elemento que tem o tipo de dados definido pelo ponteiro, e que está no endereço de memória que o ponteiro armazena):


      ponteiro^



Exemplo


  Program Ponteiros ;

  Var  a: integer;

     p: ^integer;

  Begin

      a := 8 ;    // Guardamos o valor 8 em a

      p := nil;   // O ponteiro não guarda nenhum endereço 

      writeln( 'Valor armazenado em a: ' , a );

     // Guardamos no ponteiro o endereço da variável a

     p := @a ;

     writeln( 'Valor apontado por p: ' , p^ );

     // Esse comando é equivalente a “a:= 2 * a ;” , pois p

     // aponta para o endereço de a

     a:= 2 * p^ ;

     writeln( 'O valor de a agora: ' , a );     // Imprime 16

     writeln( 'Valor apontado por p: ' , p^ );  // Imprime 16

     readln ;

  End.



Alocação Dinâmica de Memória


É possível alocar, dinamicamente, espaço na memória para um ponteiro. A quantidade de memória é determinada pelo tipo do ponteiro.


Sintaxe


new( ponteiro ) ;



Deve-se tomar cuidado para que a memória alocada com um new seja liberada antes do programa terminar.


Sintaxe


      dispose( ponteiro ) ;



Exemplo


  Program AlocacaoDinamica ;

  Var p: ^integer;

      v : integer ;

  Begin

    new( p );    // Aloca espaço para armazenar um inteiro

    p^ := 10 ;   // Guarda um inteiro na posição apontada por p

 

    writeln( 'Valor armazenado na posicao de memoria: ', p^ );

 

    v:= p^ ;     //Guardamos em v o valor apontado por p

 

    writeln( 'Valor armazenado em v: ', v );

 

    dispose( p );  // Liberamos a memoria associada a p

    readln ;

  End.



Exemplo


  // -------------------------------------------------------------

  // Este programa mostra ilustra a utilização de listas lineares

  // usando ponteiros.

  //

  // Problema. Construir uma lista linear e imprimir seus dados.

  // -------------------------------------------------------------


  Program PercorrendoLista ;


  // Definição de um tipo para representar um nó da lista

  type TNo = record

                dado : integer ;  // Dado armazenado pelo nó

                prox : ^TNo ; // Ponteiro p/ próximo nó

             end ;

 

  Var pinicio: ^TNo;    // Guarda endereço 1º nó da lista

      p1: ^TNo;         // Auxiliar. Guarda endereço de um nó

      resposta : char ; // Auxiliar. Controla repetição.

     

  Begin

    pinicio := nil ;

   

    // Repetição que define os nós da lista

    repeat

       new( p1 );

       write( 'Entre com novo dado: ' );

       readln( p1^.dado ) ;

       p1^.prox := pinicio ;

       pinicio := p1 ;

       write( 'Novo dado(S/N)?' );

       readln( resposta );

       resposta := upcase( resposta );

    Until resposta = 'N' ;


    // Percorrer a lista, imprimindo seus elementos

    p1 := pinicio ;

    while( p1 <> nil ) do

     Begin

        writeln( 'Achei: ' , p1^.dado );

        p1 := p1^.prox ;

     End;


    // Percorrer a lista, desalocando memória para os elementos

    while( pinicio <> nil ) do

    Begin

       p1 := pinicio ;

       pinicio := pinicio^.prox ;

       dispose( p1 );

    End;


    readln ;

  End.




Created with the Freeware Edition of HelpNDoc: Easily create Help documents