Beispiel 1:
program Reference1;
{$APPTYPE CONSOLE}
uses
SysUtils;
type
PStringInfo = ^TStringInfo;
TStringInfo = packed record
iRefCount : Integer;
iLenCount : Integer;
pStringAddr : Pointer;
end;
procedure ShowStringInfo(const s: String);
var
p: PStringInfo;
begin
p := Pointer(s);
Dec(Integer(p), 8);
WriteLN(Format(' String: %s', [s]));
WriteLn(Format(' p.RefCount: %d', [p^.iRefCount]));
WriteLn(Format(' p.LenCount: %d', [p^.iLenCount]));
end;
var
s, s2: String;
begin
WriteLn('Geben sie einen Text ein:');
ReadLn(s);
WriteLn;
WriteLn('Der eingegebene Text wird einer zweiten Variable zugewiesen');
WriteLn(' s2 := s;');
s2 := s;
WriteLn;
WriteLn('Inhalt von s:');
ShowStringInfo(s);
WriteLN(Format(' Pointer(s): 0x%p', [Pointer(s)]));
WriteLN(Format(' @s: 0x%p', [@s]));
WriteLn;
WriteLn('Inhalt von s2:');
ShowStringInfo(s2);
WriteLN(Format(' Pointer(s2): 0x%p', [Pointer(s2)]));
WriteLN(Format(' @s2: 0x%p', [@s2]));
ReadLn;
end.
Beispiel 2:
program Reference2;
{$APPTYPE CONSOLE}
uses
SysUtils;
type
PStringInfo = ^TStringInfo;
TStringInfo = packed record
iRefCount : Integer;
iLenCount : Integer;
pStringAddr : Pointer;
end;
procedure ShowStringInfo(const s: String);
var
p: PStringInfo;
begin
p := Pointer(s);
Dec(Integer(p), 8);
WriteLN(Format(' String: %s', [s]));
WriteLn(Format(' p.RefCount: %d', [p^.iRefCount]));
WriteLn(Format(' p.LenCount: %d', [p^.iLenCount]));
end;
var
s, s2: String;
begin
WriteLn('Geben sie einen Text ein (mind. 2 Zeichen):');
ReadLn(s);
WriteLn;
WriteLn('Der eingegebene Text wird einer zweiten Variable zugewiesen');
WriteLn(' s2 := s;');
s2 := s;
WriteLn;
WriteLn('Inhalt von s:');
ShowStringInfo(s);
WriteLN(Format(' Pointer(s): 0x%p', [Pointer(s)]));
WriteLN(Format(' @s: 0x%p', [@s]));
WriteLn;
WriteLn('Inhalt von s2:');
ShowStringInfo(s2);
WriteLN(Format(' Pointer(s2): 0x%p', [Pointer(s2)]));
WriteLN(Format(' @s2: 0x%p', [@s2]));
WriteLn;
WriteLn('Variable s wird nun direkt an Position 2 verändert');
WriteLn(' s[2] := ''X''');
s[2] := 'X';
WriteLn;
WriteLn('Inhalt von s:');
ShowStringInfo(s);
WriteLN(Format(' Pointer(s): 0x%p', [Pointer(s)]));
WriteLN(Format(' @s: 0x%p', [@s]));
WriteLn;
WriteLn('Inhalt von s2:');
ShowStringInfo(s2);
WriteLN(Format(' Pointer(s2): 0x%p', [Pointer(s2)]));
WriteLN(Format(' @s2: 0x%p', [@s2]));
ReadLn;
end.
Beispiel 3:
program Reference3;
{$APPTYPE CONSOLE}
uses
SysUtils;
type
PStringInfo = ^TStringInfo;
TStringInfo = packed record
iRefCount : Integer;
iLenCount : Integer;
pStringAddr : Pointer;
end;
procedure ShowStringInfo(const s: String);
var
p: PStringInfo;
begin
p := Pointer(s);
Dec(Integer(p), 8);
WriteLN(Format(' String: %s', [s]));
WriteLn(Format(' p.RefCount: %d', [p^.iRefCount]));
WriteLn(Format(' p.LenCount: %d', [p^.iLenCount]));
end;
var
s, s2: String;
begin
WriteLn('Geben sie einen Text ein (mind. 2 Zeichen):');
ReadLn(s);
WriteLn;
WriteLn('Der eingegebene Text wird einer zweiten Variable zugewiesen');
WriteLn(' s2 := s;');
s2 := s;
WriteLn;
WriteLn('Inhalt von s:');
ShowStringInfo(s);
WriteLN(Format(' Pointer(s): 0x%p', [Pointer(s)]));
WriteLN(Format(' @s: 0x%p', [@s]));
WriteLn;
WriteLn('Inhalt von s2:');
ShowStringInfo(s2);
WriteLN(Format(' Pointer(s2): 0x%p', [Pointer(s2)]));
WriteLN(Format(' @s2: 0x%p', [@s2]));
WriteLn;
WriteLn('Variable s wird nun INdirekt an Position 2 verändert');
WriteLn(' PChar(Cardinal(Pointer(s)) + 1)^ := ''X''');
PChar(Cardinal(Pointer(s)) + 1)^ := 'X';
WriteLn;
WriteLn('Inhalt von s:');
ShowStringInfo(s);
WriteLN(Format(' Pointer(s): 0x%p', [Pointer(s)]));
WriteLN(Format(' @s: 0x%p', [@s]));
WriteLn;
WriteLn('Inhalt von s2:');
ShowStringInfo(s2);
WriteLN(Format(' Pointer(s2): 0x%p', [Pointer(s2)]));
WriteLN(Format(' @s2: 0x%p', [@s2]));
ReadLn;
end.
Keine Kommentare:
Kommentar veröffentlichen