Ponteiros no Pascal / Delphi - Ponteiros para matrizes / vetores

Assim como dissemos no post passado que podemos usar os ponteiros para apontar para estruturas, também podemos usar os ponteiros para apontar para matrizes ou vetores. Veja o exemplo abaixo:

program Project1;
{$APPTYPE CONSOLE}

uses SysUtils;

type
  PA = ^TA;
  TA = array [0..20] of Integer;

var
  A: PA;
  i: Integer;
begin
  New(A);
  try
    FillChar(A^, SizeOf(TA), 0);
    for i := 0 to 15 do
      A^[i] := i * i;
    for i := 0 to 20 do
      WriteLn(Format(‘%d: %d’, [i, A^[i]]));
  finally
    Dispose(A);
  end;
  ReadLn;
end.

Muito similar ao ponteiro para uma estrutura, mostrado no post anterior. Observe que o New irá alocar SizeOf(TA) da memória. Isso corresponde a 4 bytes (em compilador de 32 bits) vezes 21 (de 0 à 20), um total de 84 bytes.

Com relação a derreferência automática, o mesmo acontece assim como em ponteiros para estruturas, podemos suprimir o ^, pois o compilador assume que existe uma derreferência quando encontra um [ após um ponteiro, o nosso código pode ser reescrito assim:

program Project1;
{$APPTYPE CONSOLE}

uses SysUtils;

type
  PA = ^TA;
  TA = array [0..20] of Integer;

var
  A: PA;
  i: Integer;
begin
  New(A);
  try
    FillChar(A^, SizeOf(TA), 0);
    for i := 0 to 15 do
      A[i] := i * i;
    for i := 0 to 20 do
      WriteLn(Format(‘%d: %d’, [i, A[i]]));
  finally
    Dispose(A);
  end;
  ReadLn;
end.

No caso de ponteiros para matrizes, aqui encontramos uma grande diferença em relação a linguagem C. No C, todo ponteiro pode ser um vetor,  uma notação do tipo:

int *p, a[10];
p = a;
*(p + 0) = 0;
*(p + 1) = 1;
*(p + 2) = 2;

É o mesmo que escrever:

int *p, a[10];
p = a;
p[0] = 0;
p[1] = 1;
p[2] = 2;

No Pascal / Delphi não existe esta paridade entre ponteiros e vetores. Mas existe uma forma de enganar o compilador para definirmos vetores de qualquer tamanho dinamicamente. Incluse isso era muito usado quando não tinhamos as matrizes dinâmicas na linguagem.

Basicamente, para definirmos um vetor de tamanho dinâmico, criamos um estrutura BEM grande e usamos o GetMem ao invés do New, como no exemplo:

program Project1;
{$APPTYPE CONSOLE}

uses SysUtils;

type
  PA = ^TA;
  TA = array [0..100000] of Integer;

var
  A: PA;
  i, t: Integer;
begin
  t := 16;
  GetMem(A, SizeOf(Integer) * t);
  try
    FillChar(A^, SizeOf(Integer) * t, 0);
    for i := 0 to t - 1 do
      A[i] := i * i;
    for i := 0 to t - 1 do
      WriteLn(Format(‘%d: %d’, [i, A[i]]));
  finally
    FreeMem(A);
  end;
  ReadLn;
end.

No GetMem definimos o tamanho de memória que queremos utilizar. No caso t vezes o espaço para alocar um inteiro.

0 Respostas para “Ponteiros no Pascal / Delphi - Ponteiros para matrizes / vetores”


  1. Sem comentários

Deixe uma Resposta