classtype一问 ( 积分: 100 )

  • 主题发起人 主题发起人 awfigsk
  • 开始时间 开始时间
A

awfigsk

Unregistered / Unconfirmed
GUEST, unregistred user!
classtype方法源代码如何理解?
function TObject.classType:TClass;
begin
Pointer(Result):=PPointer(Self)^;
end;

为什么不用Pointer(Self)^?
并且为何Integer(Pointer(Self)^)的值与Integer(PPointer(Self)^)的值都是一样的?
还请指点!谢谢!
 
classtype方法源代码如何理解?
function TObject.classType:TClass;
begin
Pointer(Result):=PPointer(Self)^;
end;

为什么不用Pointer(Self)^?
并且为何Integer(Pointer(Self)^)的值与Integer(PPointer(Self)^)的值都是一样的?
还请指点!谢谢!
 
PPointer表示是指向指针类型的指针
Self本身就是一个指针
 
首先你要知道的是,Pointer是无类型指针.PPointer是指向无类型指针的指针,是一个有类型的指针
Pointer(Result):=PPointer(Self)^;
那么赋值符号左边的类型是Poniter,右边的也是Pointer.可以赋值.
如果变成楼主说的形式,Pointer(Result):=Pointer(Self)^;编译都通不过去,因为右边的类型是不确定的,无类型指针做去指针操作是没有类型信息的.
 
能否这样理解:
PPointer(self) 结果是无类型指针的指针
PPointer(self)^ 结果是取无类型指针的指针所指向的内存单元的内容

Pointer(self) 结果是无类型指针
Pointer(self)^ 结果是取无类型指针所指向的内存单元的内容

PPointer(self)^有二个动作,第一取self所指向的内存单元的内容,假为A,再再A所指向的内存单元的内容

Pointer(self)^只有一个动作,就是取self所指向的内存单元的内容

还请指点,谢谢!
 
Pointer是个类型,它的类型是无类型指针,是一种指针,只不过这种指针指向内容的类型不定;而PPointer也是个指针类型,它是个有类型的指针,它指向的内容也是一个指针(无类型指针)。
Pointer(Self)^,是将Self作为无类型指针,取它的内容,但因为无类型,所以结果不能赋给任何类型的变量,但是可以用在函数的无类型参数的实参,如function TStream.Write(const Buffer
Count: Longint): Longint
function TStream.Read(var Buffer
Count: Longint): Longint;
PPointer(Self)^,是将Self作为有类型指针PPointer,取它的内容,这个结果是个Pointer类型,因此可以赋值给Pointer变量。
Pointer(Result) := PPointer(Self)^;
实际上跟Pointer(Result) := Pointer(Pointer(Self)^);是一样的,但这样子显然不如前者简洁明了啦
 
to lichengbin:
如果要取self内容所指向的内存单元的内容,那是不是可以直接这样取
var
p:pointer;
begin
p=ppointer(PPointer(self)^)^:

还请大侠指点,谢谢!
 
可以。PPointer(Self)^取的是类VMT入口地址,而PPointer(PPointer(Self)^)^实际上返回的是类第一个虚拟方法的地址
 
十分感谢您的指点!谢谢!
 
后退
顶部