请教高手一个奇怪问题,关于指针的

ppayun 2004-10-20 12:05:30
在Delphi7,如果一个类未被初始化,它指向的是哪里?
在form上随便放个button,写入如下的代码:
procedure TForm1.Button1Click(Sender: TObject);
var
aa: TButton;
begin
aa.Top := 0;
end;
运行,竟然发现Form自己的位置改变了。
把aa的类型换成TControl,TForm等等,结果都是一样。

aa在没有被创建之前,应该是nil才对,而上面的测试中
aa指向的好像是self,为什么?

把aa的类型换成TStringList,
procedure TForm1.Button1Click(Sender: TObject);
var
aa: TStringList;
begin
aa.Text := 'hehe';
end;
执行会报错,这和我理解的一样;

另外,是不是局部变量和全局变量初值有区别?当aa为局部变量时,
跟踪显示aa为不可访问,为全局变量时,aa初值为nil。在C语言中,
只保证全局指针会被初值化为NULL,局部指针的值可能是随机的。
请问Delphi的pascal语言中是否也有这样的问题?

...全文
215 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
WGYKING 2004-10-20
  • 打赏
  • 举报
回复
是这样的
全局变量会自动初始化
局部变量地址是随机的。。。
masterjames 2004-10-20
  • 打赏
  • 举报
回复
这样写不安全的
delphi_dcs 2004-10-20
  • 打赏
  • 举报
回复
他们是对的
hottey 2004-10-20
  • 打赏
  • 举报
回复
MOV EAX,EAX
行到 aa.Top := 0; 后
XOR EDX,DEX
CALL TControl.SetTop

其中EAX为 Self指针值就是Form1;
EBX为 Sender的值就是对当前对象实例Button1的引用。
此时没有这句:
MOV EAX,EBX

故EAX的值还是 Form1
调用TControl.SetTop时就是Form的Top为0了。
BigAngell 2004-10-20
  • 打赏
  • 举报
回复
学习
hottey 2004-10-20
  • 打赏
  • 举报
回复
halfdream(哈欠) 讲的好,那我就不灌水了:)
ppayun 2004-10-20
  • 打赏
  • 举报
回复
halfdream(哈欠)分析的不错,不过,我测试时实际执行的是Form1.top := 0;而不是Button1.top := 0;
EBX中保存的应该是self的指针,也就是form1的指针,对不对?
zjqyb 2004-10-20
  • 打赏
  • 举报
回复
soryy 贴错了
zjqyb 2004-10-20
  • 打赏
  • 举报
回复
BorLand 在SetLength中已处理
发现以前长度不为0,重新分配新长度,再复制旧数据,再free旧数据占用空间
qizhanfeng 2004-10-20
  • 打赏
  • 举报
回复
学习
hsmserver 2004-10-20
  • 打赏
  • 举报
回复
这是一个局部变量的问题,如果没有定义的话是错误的。

和C#道理是一样的
例如: static void main()
{int a
a=b;//这时b是错误的,因为没有定义局部变量。
}

上火,什么时候才能真正学好C#
halfdream 2004-10-20
  • 打赏
  • 举报
回复
修罗说得没错.

而且,当编译优化开关开着的时候,
var
aa: TButton;

这时候aa这个变量并没有被分配内存,可能是因为后面没有对它进行赋值的语句,编译器认为没那必要.

aa.Top := 0;
实际被编译执行时候,是调用TControl.SetTop

对于这个函数,在调它的时候,参数是寄存器传递EAX是该对象的SELF指针.

正好...
procedure TForm1.Button1Click(Sender: TObject);
这儿的Sender参数会把一个指向Button1的指针传进来,就在EBX里面.....

...
MOV EAX,EBX
CALL TCONTROL.SetTop

这样,实际是调用了 Button1.Top:=0;



呵呵..有巧合,也有规律...

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧