为什么我不能执行这个操作:
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()
使用类型化指针;他们将通过 SizeOf(TMyType) 增加/减少 PMyType。
Edit2 -- 为了使您的代码面向未来,您应该考虑 SizeOf(Pointer) 在未来的 64 位 Delphi 版本中可能会发生变化,因此这种关系SizeOf(Integer)=SizeOf(Pointer)
将不再成立。为了避免这种情况,最近的 Delphi 版本定义了类型NativeInt
和NativeUInt
,它们是与 a 大小相同的整数pointer
。