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
.