很难理解的代码。请帮助我。(50分)

  • 主题发起人 主题发起人 38152977
  • 开始时间 开始时间
3

38152977

Unregistered / Unconfirmed
GUEST, unregistred user!
class function TObject.InstanceSize: Longint;
begin
Result := PInteger(Integer(Self) + vmtInstanceSize)^;
end;
这一段,我无法理解。Pinteger()^这是返回的地址,还是大小,而所有类型前加个Ptype()
又分别是什么意思呢?特别是Ppointer();?? 50分
 
我也想知道![:)]
 
我怎么无故就给了你50分呢?真晕
 
PInteger()是将括号中的变量强制转型为整形的指针形式
这个句子
Result := PInteger(Integer(Self) + vmtInstanceSize)^;
就是说 先取Self的指针地址,然后加上vmtInstanceSize,再转换成Integer的指针,最后将指针所指内容赋给Result
 
Integer(Self) + vmtInstanceSize 这句话是不是两个地址相加,还是两个地址的值相加
 
接受答案了.
 
A:=inttostr(pinteger(integer(form1))^);
B:=edit1.Text+'==='+inttostr(pinteger(integer(form1)+vmtinstancesize)^);
我刚才测试了一下,还是有点不懂
结果是A=4581356
B=4267372
为什么A会大于B呢?按道理应该小于B才对啊
 
PInteger是指向整数的指针
vmtInstanceSize 是 System单元里定义的常量:
{ Virtual method table entries }
vmtInstanceSize = -40;
Virtual method table是在内存中对象定义的入口之前的一段记录,记录了这个对象的各种信息。其中包括了关于对象实例大小的数据(在入口前第40个字节)
Delphi中所有对象变量都是指针,因此Self是指向对象入口的指针。Integer(Self) + vmtInstanceSize是求出对象实例大小数据所在的位置,PInteger(Integer(Self) + vmtInstanceSize)^是把这个位置作为整型指针,读取所指的内容(类实例大小)

PType(整数N)就是把整数N转换为指向第N位内存单元的Type类型指针. PPointer表示无类型指针
 
刚才分给快了。不好意思,应该给(kidneyball)才对
 
var
bb:Tbutton;
edit1.Text:=inttostr(pinteger(integer(bb))^);
edit1.text:='-198458215';是负数。


bb:=Tbutton.Create(nil);//实例化之后
edit1.Text:=inttostr(pinteger(integer(bb))^);
edit1.text:='458215';是正数。

谁帮我解释一下
 
后退
顶部