Ponteiros no Pascal / Delphi - Ponteiros para estruturas (Record)

Os ponteiros podem ser usados também para indicar o endereço de uma estrutura de dados (Record em Pascal / Delphi). Basta além de definir a estrutura, também definir um ponteiro para este tipo de estrutura como no exemplo abaixo:

program Project1;
{$APPTYPE CONSOLE}

uses SysUtils;

type
  PCadastro = ^TCadastro;
  TCadastro = record
    Nome: string;
    Endereco: string;
    Idade: Integer;
  end;

var
  Cadastro: PCadastro;
begin
  New(Cadastro);
  try
    Cadastro^.Nome := ‘Alex’;
    Cadastro^.Endereco := ‘Rua X, 1′;
    Cadastro^.Idade := 35;
    WriteLn(‘Nome: ‘, Cadastro^.Nome, ‘ Endereco: ‘, Cadastro^.Endereco,
      ‘ Idade: ‘, Cadastro^.Idade);
  finally
    Dispose(Cadastro);
  end;
  ReadLn;
end.

No exemplo temos a definição de PCadastro que é um tipo ponteiro para uma estrutura TCadastro. Esta estrutura (Record) apresenta 3 campos. E definimos uma variável Cadastro do tipo PCadastro.

Quando o New é executado, é alocado na memória espaço para que caiba todos os membros de TCadastro. O mesmo New retorna na variável Cadastro o endereço de memória alocado. Assim, quando fazemos a derreferência ^, obtemos o conteúdo da memória alocada como se fosse uma variável do tipo TCadastro.

Na linguagem C, para acessar um struct (mesmo que Record) apontado por um ponteiro, podemos utilizar a seguinte sintaxe:

(*cadastro).idade = 35;

Ou ainda utilizar o operador flecha -> que já faz a derreferência:

cadastro->idade = 35;

Em Pascal / Delphi, temos o que chamamos de derreferência automática. Ou seja, quando usamos ponteiros para estruturas, pode-se omitir o operador de derrêferencia ^ para acessar os membros do Record. Quando se usa o . na frente do ponteiro, o compilador já faz internamente a derreferência. O nosso exemplo anterior pode ser reescrito da seguinte forma:

program Project1;
{$APPTYPE CONSOLE}

uses SysUtils;

type
  PCadastro = ^TCadastro;
  TCadastro = record
    Nome: string;
    Endereco: string;
    Idade: Integer;
  end;

var
  Cadastro: PCadastro;
begin
  New(Cadastro);
  try
    Cadastro.Nome := ‘Alex’;
    Cadastro.Endereco := ‘Rua X, 1′;
    Cadastro.Idade := 35;
    WriteLn(‘Nome: ‘, Cadastro.Nome, ‘ Endereco: ‘, Cadastro.Endereco,
      ‘ Idade: ‘, Cadastro.Idade);
  finally
    Dispose(Cadastro);
  end;
  ReadLn;
end.

Quando o New ocorre, ele aloca um espaço na memória, mas não a inicializa. Por causa disso, se o programador esquecer de definir algum membro da estrutura, seu conteúdo pode conter sujeira. Para evitar este tipo de transtorno, uma dica é utilizar o procedimento FillChar.

procedure FillChar(var X; Count: Integer; Value: Byte);

O FillChar, atribue o valor Value, Count vezes a partir do endereço que está alocado a variável X. Para inicializarmos endereços de memória, basta definir 0 (zero) a toda estrutura criada, no nosso exemplo bastaria escrever o seguinte código logo depois do try:

FillChar(Cadastro^, SizeOf(TCadastro), 0);

Desta forma, nem todos os membros de Cadastro precisam ser definidos.

0 Respostas para “Ponteiros no Pascal / Delphi - Ponteiros para estruturas (Record)”


  1. Sem comentários

Deixe uma Resposta