Linguagem Pascal
Variáveis Dinâmicas - Tipo Ponteiro 
    Ponteiros são variáveis dinâmicas, que não são criadas em tempo de compilação. Isto significa que o compilador não faz alocação de memória para as variáveis dinâmicas. Durante a execução do programa, podemos alocar o espaço desejado ou dispor dele quando não for mais necessário.
    As variáveis dinâmicas não são declaradas explicitamente na parte de declarações do programa, nem têm nome. A forma de se fazer referência a uma variável dinâmica é através de uma variável que contenha um endereço de memória da estrutura dinâmica. Essa outra variável é do tipo ponteiro.
Como declarar as Estruturas de Dados?
 
Sintaxe
Explicação
Type apontador = ^item; 
     item = record 
            nome: string[10]; 
            proximo: apontador; 
            end; 
Var inicio, anda: apontador;
Foi declarado um ponteiro que apontará para o registro item. Este registro tem dois campos: o nome, e o proximo que apontará para o próximo registro alocado, caso não exista, apontará para nulo.
Como inicializar os Dados?
 
Programa:
... 
Begin 
  new(inicio); {1} 
  readln(inicio^.nome);{2} 
  inicio^.proximo:=nil;{3} 
End.
Passos:
{1} um ponteiro chamado inicio é criado. 
{2} o campo nome é obtido através do usuário e preenchido. 
{3} o campo que apontará para o próximo, ficará nulo.
Como fazer uma lista?
esta lista armazenará infinitos nomes até o usuário não querer continuar
 
program lista; 
type 
    apont:^reg; 
    reg=record 
              nome: string[10]; 
              prox:apont; 
              end; 
var 
   inicio,anda,paux:apont; 
   opcao:char; 
begin 
     inicio:=nil; 
     anda:=nil; 
     repeat 
           if inicio=nil 
              then begin 
                        new(inicio); 
                        writeln('Digite o nome'); 
                        readln(inicio^.nome); 
                        inicio^.prox:=nil; 
                        paux:=inicio; 
                        end 
              else begin 
                        new(anda); 
                        writeln('Digite o nome'); 
                        readln(anda^.nome); 
                        anda^.prox:=nil; 
                        paux^.prox:=anda; 
                        paux:=anda; 
                        end; 
              writeln('Deseja continuar? <s/n>'); 
              readln(opcao); 
           until opcao='n'; 
end.
Como desalocar um ponteiro?
 
Begin 
.... 
{depois de criado e não ser mais necessário} 
dispose(inicio); 
.... 
end.

 Exercício
Tente fazer o exercício, depois veja uma das soluções mais abaixo na página.
1) Fazer uma lista ordenada de usuários. Você deve incluir usuários ordenadamente usuários de uma rede. Fazer um procedimento para isto e outro para impressao dos mesmos. Você deve fazer todo programa! 
veja a resolução
program lista;
type
    palavra=string[10];
    apont=^reg;
    reg=record
              nome: palavra;
              prox:apont;
              end;
procedure InsereOrdenado(var head:apont;nome:palavra);
var
    anterior,seguinte,local:apont;
    ok:boolean;
begin
    new(local);
    local^.nome:=nome;
    if head = nil {lista vazia}
        then begin {insere no inicio da lista}
                local^.prox:=head;
                head:=local;
                end
        else begin if nome<=head^.nome {precede o primeiro}
                     then begin {insere no inicio da lista}
                        local^.prox:=head;
                        head:=local;
                        end
                     else begin {insere no meio da lista}
                        ok:=false;
                        anterior:=head;
                        seguinte:=head^.prox;
                        repeat
                            if nome<=seguinte^.nome
                                then begin
                                        local^.prox:=seguinte;
                                        anterior^.prox:=local;
                                        ok:=true;
                                        end;
                        until ok or (seguinte=nil);
                        if not(ok)then begin {insere no fim}
                                        local^.prox:=nil;
                                        anterior^.prox:=local;
                                        end;
                        end;
                end;
end;
procedure impressao(inicio:apont);
var
   p:apont;
begin
     p:=inicio;
     if p=nil
        then writeln('lista vazia')
        else repeat
                   writeln(p^.nome);
                   p:=p^.prox;
                   until p=nil;
end;
var
  opcao:char;
  nome01:palavra;
  inicio:apont;
begin
     inicio:=nil;
     repeat
           writeln('digite o nome');
           readln(nome01);
           InsereOrdenado(inicio,nome01);
           writeln('Quer continuar inserindo?<s/n>');
           readln(opcao);
           until opcao='n';
     writeln('Quer ver a lista?<s/n>'); {aqui nÆo h  consistencia, vc deve fazer}
     readln(opcao);
     if opcao<>'n'
        then impressao(inicio);
end. 
A bibliografia utilizada nas definições e exercícios são do
Livro Pascal II de Lisbete Madsen Barbosa. Ed. McGraw-Hill