请问关于指针使用的有关问题

请教关于指针使用的问题
先进行以下定义:
type
TTestType = class
  testtype2:Word;
class function Initialize:pointer;
end;
class function TTestType.Initialize:pointer;
var
data:pointer;
begin
  data:=AllocMem(TTestType.InstanceSize);
end;
以上定义好了后,运行下面的按钮事件,在test3:=@(test2.testtype2);就会报错,只有改成test3:=@(TTestType(test2).testtype2);才能运行通过。请问为什么不能直接用test2这个指针,或者以test2^的方式使用,一定要用强制类型转换 ?
procedure TForm1.Button1Click(Sender: TObject);
var
test2:^TTestType;
test3:pointer;
begin
  test2:=TTestType.Initialize;
    test3:=@(test2.testtype2);
end;
------解决思路----------------------
引用:
能不能这么理解。test2存储的是地址这是没问题的,即使定义的是TTestType类型的指针,但是在使用时,如果直接使用test2变量或test2^,就完全是对内存地址的操作, 比如偏移量计算。如果用强制转换TTestType(test2), 编译器会按照一个实例来操作。但是对于简单类型,比如定义A为Pword,并将变量b:=132的地址赋值为A,那么在使用A^时能直接获取132的值,而不会操作地址,但是 test2^还是针对地址的操作,而不会将test2作为实例操作。这个我始终无法形成统一的认识。


【如果用强制转换TTestType(test2), 编译器会按照一个实例来操作。】----错,你没有Create它,就没有实例
因为它们在内存的字节上是兼容的,所以语法上允许强制转换。强制转换后编译器按TTestType的内存对齐和偏移格式来解析它,但解析的结果不会正确(你这里并没有取结果,只是取偏移值)。


【但是对于简单类型,比如定义A为Pword,并将变量b:=132的地址赋值为A,那么在使用A^时能直接获取132的值,而不会操作地址】---你都说了【将变量b:=132的地址赋值为A】即然是地址赋值【而不会操作地址】这无语了…

var
  I:Integer;
  PI:^Integer;
begin
  I:=5;
  PI:=@I;
  PI^:=50;
  ShowMessage(IntToStr(I));
end;



【但是 test2^还是针对地址的操作,而不会将test2作为实例操作。这个我始终无法形成统一的认识。】
实例是Create出来的,你都没Create,甚至你的类中连构造函数都没有,哪来的实例?【人类】是类,【张三】是实例,类就是个模板。


var
  SL:TStringList;
begin
  SL:=TStringList.Create;//TStringList是类(模板);SL是从类Create出来的对象
  try
    SL.Add('aaaa');//如果没有上面的代码Create它,这行执行吗?
  finally
    FreeAndNil(SL);
  end;
end;

------解决思路----------------------
1、test2定义为指定TTestType的指针变量,它只是地址。

2、如果实例,这样定义:
var test1:TTestType;
实例化:
test1:=TTestType.Create;
test1.testtype2:=12345;
Edit1.Text:=IntToStr(test1.testtype2);   // 值就是12345