(***********************************)
                   (* Dynamicke pole, pointer na pole *)
                   (***********************************)

program DemoDDS2;

const
  DelkaPole = 10;

type
  TPole = array[1..DelkaPole] of word;
  PWord = ^word;

var
  SPole: TPole;      { staticke pole prvku typu word }
  DPole: ^TPole;     { pointer na dynamicke pole prvku typu word }
  ps, pd: PWord;     { pointery na datovy typ word }
  i: integer;

procedure Vymena(p1, p2: PWord);
var
  w: word;
begin
  w   := p1^;
  p1^ := p2^;
  p2^ := w;
end;

begin
{ stav pameti pro promenne:
  - SPole       100 x 2 B = 200 B
  - DPole                     4 B
  - ps                        4 B
  - pd                        4 B
  - i                         2 B
  Celkem:                   214 Byte }

  New(DPole);  { od teto chvile existuje dynamicka promenna, na kterou
                 ukazuje pointer DPole. Velikost teto dynamicke promenne
                 je stejna jako velikost staticke promenne SPole }

{ stav pameti pro promenne:
  - SPole       100 x 2 B = 200 B
  - DPole   4 + 100 x 2 B = 204 B
  - ps                        4 B
  - pd                        4 B
  - i                         2 B
  Celkem:                   414 Byte }

{ naplnime obe pole cisly }
  for i := 1 to DelkaPole do begin
    SPole[i] := i;                     { 1, 2, 3, ... }
    DPole^[i]:= i*10;                  { 10, 20, 30, ... }
  end;

{ obe pole vypiseme }
  writeln;
  for i := 1 to DelkaPole do write(SPole[i]:4);
  writeln;
  for i := 1 to DelkaPole do write(DPole^[i]:4);
  writeln;

  ps := @SPole[1];   { pointer ps ukazuje na prvni prvek
                       statickeho pole SPole }
  pd := @DPole^[1];  { pointer pd ukazuje na prvni prvek
                       dynamickeho pole DPole^ }

  inc(ps);         { pointer ps se posune o 1 prvek = 2 B dal v poli SPole }
  inc(pd);         { pointer pd se posune o 1 prvek = 2 B dal v poli DPole^ }

  dec(ps);         { ps ukazuje na 1. prvek pole SPole }
  ps^ := pd^;      { do 1. prvku SPole se nacte obsah 2. prvku DPole^ }
  inc(ps,5);
  inc(pd,3);
  Vymena(ps,pd);   { totez jako Vymena(@SPole[6],@(DPole^[5]); }

  writeln;
  for i := 1 to DelkaPole do write(SPole[i]:4);
  writeln;
  for i := 1 to DelkaPole do write(DPole^[i]:4);

  Dispose(DPole);
  DPole := nil;
  ps    := nil;
  pd    := nil;

{ stav pameti pro promenne:
  - SPole       100 x 2 B = 200 B
  - DPole                     4 B
  - ps                        4 B
  - pd                        4 B
  - i                         2 B
  Celkem:                   214 Byte }

  readln;
end.