又悟出两个本应用脚指头就能想到的道理。

来源:互联网 发布:淘宝天猫投诉电话多少 编辑:程序博客网 时间:2024/04/29 00:27
写了两个保存(对象的)指针的方法,又悟出两个本应用脚指头就能想到的道理。
 
procedure TForm1.Button5Click(Sender: TObject);
var
  _lbl:^TLabel;
  list:TList;
  i:integer;
begin
  list:=TList.create;
  new(_lbl);
  _lbl^:=TLabel.create(nil);
  _lbl^.Caption:='猪?';
  List.Add(_lbl);
  new(_lbl);
  _lbl^:=TLabel.create(nil);
  _lbl^.Caption:='你!';
  List.Add(_lbl);
  for i:=0 to list.Count-1 do
  begin
    Memo1.Lines.add(TLabel(list[i]^).caption)
  end;
end;
 
 

procedure TForm1.Button6Click(Sender: TObject);
var
 lbl:TLabel;
 prt:pointer;
 list:TList;
 i:integer;
begin
 list:=TList.create;
 lbl:=TLabel.create(nil);
 lbl.caption:='猪?';
 prt:=pointer(lbl);
 list.add(prt);
 lbl:=TLabel.create(nil);
 lbl.caption:='你!';
 prt:=pointer(lbl);
 list.add(prt);
 for i:=0 to list.Count-1 do
 begin
   Memo1.Lines.add(TLabel(list[i]).caption)
 end;
end;

输出都是

Memo1
猪?
你!

前者每次都创建一个对象的指针p,该p先指向对象,对象又指向猪所在的地盘。记录了该指针指向的地址。

后者每次对对象o重新分配空间,然后这个o(实质上也是指针)指向一个地址,这个地址就是猪所在的地盘范围。记录了该地址值。

不知道世人们都是用哪个方法,在object pascal里不碰指针好多年。不过看到

Memo1.Lines.add(TLabel(list[i]^).caption)

Memo1.Lines.add(TLabel(list[i]).caption)

这两句,突然悟到:

类型的强制转换TClassName(x),无非瓜号里x的值是对象的头地址,以这个头地址为起点,TClassName这个类的大小为势力范围,把这块地址再瓜分一下。瓜号里的东西,无论常量变量,永远都是对象所在的地址,刚刚才发现,x居然可以是常量。

寒啊!可怜的理论基础。。

要扎扎实实的学习为祖国和人民服务的本领了。。。。