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