请问关于指针使用的有关问题
请教关于指针使用的问题
先进行以下定义:
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;
------解决思路----------------------
【如果用强制转换TTestType(test2), 编译器会按照一个实例来操作。】----错,你没有Create它,就没有实例
因为它们在内存的字节上是兼容的,所以语法上允许强制转换。强制转换后编译器按TTestType的内存对齐和偏移格式来解析它,但解析的结果不会正确(你这里并没有取结果,只是取偏移值)。
【但是对于简单类型,比如定义A为Pword,并将变量b:=132的地址赋值为A,那么在使用A^时能直接获取132的值,而不会操作地址】---你都说了【将变量b:=132的地址赋值为A】即然是地址赋值【而不会操作地址】这无语了…
【但是 test2^还是针对地址的操作,而不会将test2作为实例操作。这个我始终无法形成统一的认识。】
实例是Create出来的,你都没Create,甚至你的类中连构造函数都没有,哪来的实例?【人类】是类,【张三】是实例,类就是个模板。
------解决思路----------------------
1、test2定义为指定TTestType的指针变量,它只是地址。
2、如果实例,这样定义:
var test1:TTestType;
实例化:
test1:=TTestType.Create;
test1.testtype2:=12345;
Edit1.Text:=IntToStr(test1.testtype2); // 值就是12345
先进行以下定义:
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;
------解决思路----------------------
【如果用强制转换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