2

为什么我不能执行这个操作:

var
  data:pbyte;
  x:int64;
  o:pointer; 
begin
  o:=data+x;
end;
4

2 回答 2

11

PChar 是一个指向 char 的指针,但它得到了编译器的特殊支持,以允许指针算法在 Delphi 中使类似 C 的字符串操作更容易。PByte 只是一个普通的老式类型指针,编译器没有特别注意允许指针运算。

在 Delphi 2009 中,引入了一个新的编译器指令($POINTERMATH ON/OFF),它允许您将指针算术的编译器支持添加到您自己的指针类型声明中。

于 2010-08-04T18:25:53.077 回答
3
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 版本定义了类型NativeIntNativeUInt,它们是与 a 大小相同的整数pointer

于 2010-08-04T18:36:52.130 回答