Ano, teď je již problém jasný. Typ PChar je totiž již ukazatel sám o sobě (proto to P na začátku)
takže s1 a s2 jsou něco jako ukazatel na ukazatelThe generic PChar represents a pointer to a Char
Tvůj kód by měl vypadat takto:
var p1, p2: pchar;
s1, s2: ^pchar;
begin
p1:= pchar('a');
p2:= pchar('A');
s1:= @p1;
s2:= @p2;
showmessage(inttostr(p2 - p1));
end;