какая разница между pchar и pbyte - PullRequest
2 голосов
/ 04 августа 2010

Почему я не могу выполнить эту операцию:

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

Ответы [ 2 ]

11 голосов
/ 04 августа 2010

PChar - это указатель на char, но он получает специальную поддержку от компилятора, чтобы позволить арифметике указателей упростить манипуляции с C-подобными строками в Delphi. PByte - это просто старый типизированный указатель, и компилятору не уделяется никакого особого внимания для разрешения арифметики указателей.

В Delphi 2009, была введена новая директива компилятора ($ POINTERMATH ON / OFF), которая позволяет добавлять поддержку компилятора для арифметики указателей в ваши собственные объявления типов указателей.

3 голосов
/ 04 августа 2010
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 - для защиты вашего будущего кода вы должны учитывать, что SizeOf (Pointer), вероятно, изменится в будущих 64-битных версиях Delphi, так чтоотношения SizeOf(Integer)=SizeOf(Pointer) больше не будут сохраняться.Чтобы обойти это, последние версии Delphi определяют типы NativeInt и NativeUInt, которые являются целыми числами того же размера, что и pointer.

...