pchar和pbyte有什么区别

时间:2010-08-04 18:15:37

标签: delphi pointer-arithmetic

为什么我不能执行此操作:

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

2 个答案:

答案 0 :(得分:11)

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

在Delphi 2009中,a new compiler directive was introduced($ POINTERMATH ON / OFF)允许您将指针算法的编译器支持添加到您自己的指针类型声明中。

答案 1 :(得分: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及更高版本中可用,请参阅here)。另一种方法是遵循以下模式:

NewPointer:= Pointer(Integer(OldPointer)+IntegerValue)

Edit1 - 请注意(正如另一个答案的评论中所指出的那样),inc()dec()也可以使用键入的指针;它们将通过SizeOf(TMyType)递增/递减PMyType。

Edit2 - 为了使您的代码能够面向未来,您应该考虑在未来的64位Delphi版本中,SizeOf(指针)可能会发生变化,因此SizeOf(Integer)=SizeOf(Pointer)之间的关系将不再适用。为了避免这种情况,最近的Delphi版本定义了NativeIntNativeUInt类型,它们是与pointer大小相同的整数。