指针(Pointer)怎样向后偏移?(80分)

  • 主题发起人 主题发起人 hhb1981
  • 开始时间 开始时间
H

hhb1981

Unregistered / Unconfirmed
GUEST, unregistred user!
procedure Process(stream: TStream);
var
Buffer, p: Pointer;
B: Byte;
begin
Buffer := AllocMem(1024);
stream.Read(Buffer, 1024);

p := Buffer + 10; // <-- Error
CopyMemory(Addr(B), p, 1);

case B of
0: ...;
1: ...;
end;

FreeMem(Buffer);
end;

该段程序的目的是想把传入的stream的第十个字节取出来,然后根据该字节的内容调用其他子处理。

在编译的时候,“p := Buffer + 1;”出现了错误,内容是:“Operator not applicable to this operand type”。

我查了一下Delphi5自带的Help文档,说Delphi支持指针相加(+)的,但不知道为什么报错。。。
 
p := pointer(Integer(Buffer) + 10);
 
转成integer可以,也可以转成pchar,然后直接用inc,dec函数:
var pp: pchar;
pp := buffer;
inc(pp, 10);
p := pp;
//p := Buffer + 10
 
和C、C++一样。无类型指针不能用加,因为编译器不知道你要加多少。
有类型指针可以用加,例如P+2,就会加2*SizeOf(指针类型)个字节。
所以这里你可以
p := PChar(Buffer) + 10;
就把P指向了Buffer所指地址之后的10个字节的地址。
 
Borland不太支持用指针,因为容易出错,可以通过转变类型来实现。
Interger(P) := Integer(Buf) + 10;
 
谢谢大家~
 
多人接受答案了。
 

Similar threads

后退
顶部