この操作を実行できない理由:
var
data:pbyte;
x:int64;
o:pointer;
begin
o:=data+x;
end;
この操作を実行できない理由:
var
data:pbyte;
x:int64;
o:pointer;
begin
o:=data+x;
end;
PCharはcharへのポインタですが、DelphiでのCのような文字列操作を容易にするためのポインタ演算を可能にするために、コンパイラから特別なサポートを受けています。PByteは単なる古い型のポインターであり、ポインターの演算を可能にするためにコンパイラーから特別な注意を払うことはありません。
Delphi 2009では、新しいコンパイラ指令($ POINTERMATH ON / OFF)が導入されました。これにより、ポインタ演算のコンパイラサポートを独自のポインタ型宣言に追加できます。
pbyte = ^byte;
pchar = ^char;
古い Delphi バージョン(D2009 より前)では、SizeOf(char)
= SizeOf(byte)
、つまり 8 ビットです。D2009 以降でchar
は、16 ビットですがbyte
、8 ビットのままであるため、次のようになります。
SizeOf(byte)=1
SizeOf(char)=2
値を追加するなどしてポインターを変更できるようにするには、$POINTERMATH ON
(D2009 以降で使用可能、こちらを参照) を使用できます。別の方法は、次のパターンに従うことです。
NewPointer:= Pointer(Integer(OldPointer)+IntegerValue)
Edit1 - (別の回答へのコメントで指摘されているように)、型付きポインタも操作することに注意してinc()
くださいdec()
。それらは、PMyType を SizeOf(TMyType) だけインクリメント/デクリメントします。
Edit2 -- コードの将来性を保証するために、今後の 64 ビット Delphi バージョンでは SizeOf(Pointer) がおそらく変更され、関係SizeOf(Integer)=SizeOf(Pointer)
が維持されなくなることを考慮する必要があります。これを回避するために、最近の Delphi バージョンでは、 a と同じサイズの整数である型NativeInt
and を定義しています。NativeUInt
pointer