向各位大侠请教!!!(delphi 忠实的朋友)(100分)

  • 主题发起人 zhaogh_2171
  • 开始时间
var a,b:array[0..10]of string;
begin
a[1]:='123';
a[2]:='456';
b:=a ;
a[1]:='654';
a[2]:='321' ;
showmessage(a[1]+a[2]+'|'+b[1]+b[2]);
结果:654321|123456
 
type
TA = record
a: string;
b: string;
end;
var a,b:ta;
begin
a.a:='123';
a.b :='456';
b:=a ;
a.a:='654';
a.b :='321' ;
showmessage(a.a+a.b+'|'+b.a +b.b );
结果:654321|123456
 
1. c:string;
2. begin
3. a:=tstringlist.Create ;
4. b:=tstringlist.Create ;
5. a.Add('123');
6. a.add('456');
7. b:=a ;
8. a.Clear ;
9. a.add('654');
10.a.add('321');
11.edit1.Text :=a.GetText ;
12.edit2.Text :=b.GetText ;
13.freeandnil(a);
14.edit3.Text :=b.GetText ;
不管有没有第4行,执行第14行时是要报错的,并且edit1.Text 和edit2.Text中的数据是相同的。
如果有第4行那么B原来的内存就收不回来了?
而这样就
var a,b:tstringlist;
c:string;
begin
a:=tstringlist.Create ;
b:=tstringlist.Create ;
a.Add('123');
a.add('456');
//b:=a ;
//a.Clear ;
b.add('654');
b.add('321');
edit1.Text :=a.GetText ;
edit2.Text :=b.GetText ;
freeandnil(a);
edit3.Text :=b.GetText ;
就可以在free a 后再 访问b.
所以我认为下面的说法是对的:
来自:z_cd, 时间:2003-12-18 8:56:00, ID:2361398
上面说的不全对
1.变量是赋值
2.数组变量也是赋值
3.record类型变量还是赋值
4.类变量,是赋指针了
只要不需要构造、分配内存就可以用的东西,都是赋值,也就是Delphi会自动拷贝内存
 
我记得书上也是这样讲的:
来自:z_cd, 时间:2003-12-18 8:56:00, ID:2361398
上面说的不全对
1.变量是赋值
2.数组变量也是赋值
3.record类型变量还是赋值
4.类变量,是赋指针了
只要不需要构造、分配内存就可以用的东西,都是赋值,也就是Delphi会自动拷贝内存
 
qince请你讲清楚一些,谢谢了
 
to woding:
string变量比较特殊,不见的是赋值吧,数组的动态数组也不是赋值吧
var
a,b:string;
begin
a:='123';
b:=a
//这时候a,b指向同一内存
showmessage('a address is:'+inttostr(integer(a))+' b address is:'+inttostr(integer(b)));
a:='321';//当其中一个改变时才会给其分配新的内存,这时a,b的地址不一样了
showmessage('a address is:'+inttostr(integer(a))+' b address is:'+inttostr(integer(b)));
end;
 
我这下真的很“迷糊”了,呵呵,没有侵犯版权吧
 
STRING的COPY-ON-WRITE技术,很少影响你使用STRING,只是DELPHI的一种性能优化手段。
静态数组也和STRING类型一样,使用COPY-ON-WRITE。当使用A:=B的形式时,
A指向B数组的内容地址,当A或B之一修改时,DELPHI生成的机器码自动生成一份新的内
容拷贝。
动态数组的赋值不使用COPY-ON-WRITE,只是简单的指针赋值。
记录类型赋值是不使用COPY-ON-WRITE,直接COPY记录值,而不是指针。
 
呵呵,COPY-ON-WRITE,同意fantasy。
那么variant又是那种情况呢?
 
VARIANT可以代表太多的类型,从用户层来看A:=B时,就是一条通常的赋值语句。
事实上,VARIANT针对A/B为不同数据类型的情况生成了不同的机器代码。所以,
我猜想要理解VARIANT的赋值,可以想像语句A:=B中,最终的A的类型和B的类型是
什么,然后按照该种类型的数据来理解赋值过程。
 
动态数组的赋值不使用COPY-ON-WRITE,只是简单的指针赋值。
不是的吧?
 
我在用delphi编程时,有几个赋值语句不明白其道理。
如:
var
a, b: integer;
begin
a := 1;
b := a;
end;
上面是简单变量赋值 a 赋给 b ,b里存是a的指针还是,b里存的是1。在内存中是两分1还是一份。
答。内存中有两份.数值都是1.
var
a: Array[0..100] of char
b: Array[0..100] of char
begin
b := a;
end;
数组赋值和简单变量赋值一样么?
答:有一份。数组赋值传递的是指针。因此A,B用的是同一地址,只是用了两个变量名字。

还有机构类型变量的赋值又是怎么样的?
type
TA = record
a1: integer;
end;
var
a: TA;
b: TA;
begin
b := a
该项赋值delphi是怎样处理的?
end;
答。两份记录变量,数值一样,地址不一样。
还有类变量赋值是怎么处理的?
var
a: TA;
b: TA;
begin
a :=TA.Create
b := a
?请问a实例内存中有几个? 该项赋值delphi是怎样处理的?
end

答。实例只有一个,即TA.CreateB创建的。有地址不同的A,B两个指针变量,但A,B这两个指针变量里的内容是一样的,都指向TA.Create创建的实例。


来自:andy263, 时间:2003-12-17 18:45:00, ID:2360848
变量是赋值
书祖是获得指针(会同步)


来自:zhaogh_2171, 时间:2003-12-18 8:34:00, ID:2361326
to andy263,
对象赋值是怎样的能?
var
a, b: integer;
begin
a := 1;
b := a;
end;
 
老兄还不结帖啊....................
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
S
回复
0
查看
950
SUNSTONE的Delphi笔记
S
D
回复
0
查看
1K
DelphiTeacher的专栏
D
S
回复
0
查看
774
SUNSTONE的Delphi笔记
S
顶部