{********************************************************** Simple example of how using pointers Author: Didier Cabalé 'Bellefont' 31800 Saint-Gaudens, France tél: +33 (0)5 61 89 72 92 e-mail: didier.cabale+delphi@gmail.com web-page: http://didier.cabale.free.fr/delphi.htm ***********************************************************} program Pointers; {$APPTYPE CONSOLE} {$R *.res} uses System.Types // TIntegerDynArray , System.Generics.Collections // PObject , System.SysUtils // IntToStr() ; type TStatIntArray = Array[0..1] of Integer; PStatIntArray = ^TStatIntArray; TStatCharArray = Array[0..5] of Char; TRec = record aField: TStatCharArray; end; PRec = ^TRec; const cI: integer = 100; cS: ShortString = 'didier'; cStatArray: Array[0..1, 0..1] of Integer = ((1, 2), (3, 4)); aRec: TRec = (aField: 'cabalé'); var O, O2: TObject; PointersArr: Array of Pointer; P: Pointer; IntArray: TIntegerDynArray; // IntegerArray is static i: Integer; begin try { TODO -oUser -cConsole Main : Insert code here } O := TObject.Create; try SetLength(PointersArr, 6); PointersArr[0] := @cI; PointersArr[1] := Addr(cS); // Addr equiv @ i := Integer(PointersArr[1]); PointersArr[2] := @cStatArray[0, 0]; SetLength(IntArray, 2); IntArray[0] := 11; IntArray[1] := 12; PointersArr[3] := @IntArray[0]; PointersArr[4] := @aRec; PointersArr[5] := @O; Writeln('----------------'); Writeln('pointer values:'); for P in PointersArr do Writeln(Integer(P)); Writeln('----------------'); Writeln('data at pointers address:'); Writeln('cI: ', PInteger(PointersArr[0])^); Writeln('cS: ', PShortString(i)^); // integer can be typecasted Writeln('cStatArray value: '+ Format('(%d, %d)', [PStatIntArray(PointersArr[2])^[0], PStatIntArray(PointersArr[2])^[1]])); Writeln('aDynArray value: '+ Format('(%d, %d)', [PStatIntArray(PointersArr[3])^[0], PStatIntArray(PointersArr[3])^[1]])); Writeln('aRec.aField: '+ PRec(PointersArr[4])^.aField); Writeln('O class: '+ PObject(PointersArr[5])^.ClassName); Writeln('----------------'); Writeln('Type instance <-> Pointers'); Writeln('O.ClassName: ', O.ClassName); PointersArr[5] := @O; Writeln(Format('PointersArr[5] Value: %d; PointersArr[5] reference: %s', [Integer(PointersArr[5]), PObject(PointersArr[5])^.ClassName])); O2 := TObject(PointersArr[5]^); Writeln('proof of back reference: O2.ClassName: ', O2.ClassName); finally O.Free; end; Readln; except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; end.