VCL有这样一段代码:
function TObject.ClassType: TClass;
begin
Pointer(Result) := PPointer(Self)^;
end;
class function TObject.ClassName: ShortString;
begin
Result := PShortString(PPointer(Integer(Self) + vmtClassName)^)^
end;
看懂了这段代码,差不多你对Delphi中的指针机制有了一定的了解。
在讲解这段代码之前,看看下面这个问题:
请问 PPointer(A) 和 Pointer(A) 有何异同? (A是一个指针)
我们借着这个问题就可以理解上面的VCL代码了。
PPointer(A) 就是将指针A强制转化为指向指针的指针, 它还是一个指针, 不过该指针指向的对象是指 针类型。而Pointer(A) 就是讲指针A强制转化为一个无类型指针, 它也还是一个指针, 不过该指针指 向的对象是无类型的。
我们知道Delphi中的任一对象都是一个指针, 也就是Self指针。PPointer(Self)^的解析应当是这样 的,先将Self指针强制转化为指向指针的指针(这句话就是PPointer(Self)的意思), ^就是取 指针
PPointer(Self)的内容。
声明这样一个对象TObject obj1
function TObject.ClassType: TClass;
begin
Pointer(Result) := PPointer(Self)^;
end;
class function TObject.ClassName: ShortString;
begin
Result := PShortString(PPointer(Integer(Self) + vmtClassName)^)^
end;
看懂了这段代码,差不多你对Delphi中的指针机制有了一定的了解。
在讲解这段代码之前,看看下面这个问题:
请问 PPointer(A) 和 Pointer(A) 有何异同? (A是一个指针)
我们借着这个问题就可以理解上面的VCL代码了。
PPointer(A) 就是将指针A强制转化为指向指针的指针, 它还是一个指针, 不过该指针指向的对象是指 针类型。而Pointer(A) 就是讲指针A强制转化为一个无类型指针, 它也还是一个指针, 不过该指针指 向的对象是无类型的。
我们知道Delphi中的任一对象都是一个指针, 也就是Self指针。PPointer(Self)^的解析应当是这样 的,先将Self指针强制转化为指向指针的指针(这句话就是PPointer(Self)的意思), ^就是取 指针
PPointer(Self)的内容。
声明这样一个对象TObject obj1
Self
转自:点击打开链接