(********************************)
                    (* Typovy pointer na datovy typ *)
                    (*   integer, string a zaznam   *)
                    (********************************)

program DemoDDS1;

type
  zaznam = record
    cisloByte: byte;
    cisloInt: integer;
    retezec: string;
  end;

var        { v sekci var se deklaruji staticke datove struktury }
  pInt: ^integer;       { pointer na datovy typ integer }
  pStr: ^string;        { pointer na datovy typ string }
  pZ:   ^zaznam;        { pointer na datovy typ zaznam }

  i: integer;
  z: zaznam;

begin
  i := 1;
  z.cisloByte := 2;
  z.cisloInt := 35;
  z.retezec := 'abcd';

{ pointery budou ukazovat na existujici promenne, ktere jsou
  staticke datove struktury: }
  pInt := @i;          { pointer pInt obsahuje adresu promenne i, tedy
                         ukazuje na promennou i }
  pZ := @z;            { pointer pZ obsahuje adresu promenne z, tedy
                         ukazuje na promennou z }

  pInt^ := 10;         { vysledek je stejny, jako bychom napsali i:=10; }

  pZ^.cisloInt := pInt^; { do zaznamu z - jeho prvku "druhy" se nacte obsah
                         promenne i, tedy 10; stejne jako pZ^.cisloInt:=i; }
  pStr := @ z.retezec; { pointer pts ukazuje na treti prvek zaznamu z,
                         ktery je typu string }
  writeln(pStr^);      { vypise se retezec, na ktery pStr ukazuje }
  writeln(pZ^.retezec);{ totez jako predchozi prikaz }

  writeln(pStr^[1]);   { vypise prvni znak retezce, na ktery ukazuje pStr }
  writeln(pZ^.retezec[1]); { totez jako predchozi prikaz }

  pInt := nil;   { obsahem promenne pInt (adresou, na kterou ukazuje), je 0 }

{ pointery budou ukazovat na dynamicke promenne, ktere jsou
  dynamicke datove struktury: }
  New(pInt);         { v pameti se vytvori dynamicka promenna o delce 2 B,
                       pointer pInt obsahuje jeji adresu }
  pInt^ := 82;       { obsahem dynamicke promenne je cislo 82,
                       s promennou i uz nema nic spolecneho, nemeni ji }
  pZ^.cisloInt := pInt^;
  z.cisloInt := pInt^; { totez jako predchozi prikaz }

  GetMem(pZ,sizeof(pZ^));  { nebo GetMem(pZ,sizeof(zaznam)); }
  pZ^.cisloByte := z.cisloByte+24;
  pZ^.cisloInt := pInt^;

{ vsechnu pamet, kterou jsme "rucne" zabrali, musime taky "rucne" uvolnit: }
  Dispose(pInt);     { dynamickou promennou, na kterou ukazoval pInt,
                       uz nepotrebujeme }
  pInt := nil;       { na konci programu neni nutne, ale je to dobry zvyk }
  FreeMem(pZ, sizeof(pZ^));
  pZ := nil;

  readln;
end.