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

  • 主题发起人 zhaogh_2171
  • 开始时间
Z

zhaogh_2171

Unregistered / Unconfirmed
GUEST, unregistred user!
我在用delphi编程时,有几个赋值语句不明白其道理。
如:
var
a, b: integer;
begin
a := 1;
b := a;
end;
上面是简单变量赋值 a 赋给 b ,b里存是a的指针还是,b里存的是1。在内存中是两分1还是一份。
var
a: Array[0..100] of char
b: Array[0..100] of char
begin
b := a;
end;
数组赋值和简单变量赋值一样么?

还有机构类型变量的赋值又是怎么样的?
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;
 
变量是赋值
书祖是获得指针(会同步)
 
to andy263,
对象赋值是怎样的能?
 
上面说的不全对
1.变量是赋值
2.数组变量也是赋值
3.record类型变量还是赋值
4.类变量,是赋指针了
只要不需要构造、分配内存就可以用的东西,都是赋值,也就是Delphi会自动拷贝内存
 
对于前两种你可以测试,就是把b:=a后,然后改变a的值,最后showmessage看看b的值,你就明白了!
 
to z_cd:
谢谢你的回答,还想问一下赋值在delphi是怎样实现的能?
 
都是两分,因为声明的时候已经定义分配了内存
 
请问数组长度不定,怎样分配内存呀?
 
不定长数组,定义对应该数组的指针类型变量
然后用 New 函数分配内存。
一定要记住在用完该数组的时候 Free 掉(虽然Delphi好像可以自动检查内存泄露,但还是自己做最好)
 
那位大侠能详细阐述一下赋值的机理么?
 
不同意上面的观点,不论简单变量,数组,对象
a:=x;
b:=a;
这样的符值内存中只有一份,当a的值改变的时候会把原值复制一份给b。
------我记得是这样的
 
你记错了
 
看看谭浩强同志的C语言编程里面的 变量 这一章节,可以的话再看看数据结构

变量分为基本类型和构造类型
通常基本类型包括:char,int,bool
而构造类型就五花八门了,数组、集合、对象...
判断方法其实很容易,用下面的方法试试:
a := XXX;
b := a;
a := YYY
//改变a的值,看它会不会导致b也跟着变化

如果执行完最后一句后,a仍然与b一致,毫无疑问它赋的是指针,否则就是赋的值;

除非代码用的是取指针,否则基本类型一般是直接赋值(包括String),构造类型赋的是指针,赋值的情况下,内存中会有两份,如果赋的是指针,则有两个变量地址,但它们指向同一内存块
 
看来我是真的记错了,不过 大侠不要光一句话否定我的观点,能不能讲讲其中的原委,在下不胜感激
我再解释一下我的观点:
var
a,b:tlist

a:=tlist.create;
b:=a;
这样的赋值肯定内存中只有一份吧。
另外楼上朋友提到的string类型,好像内存中也只有一份,不知下面的代码能不能说明问题
var
a,b:string;

a:='asasas';
b:=a;
showmessage('a address is:'+inttostr(integer(a))+' b address is:'+inttostr(integer(b)));

当 a的值变化时b没有随着变化,并不能说明在b:=a;时会给b分配新的内存块,这时只是增加了a指向的字符串的引用计数。当a的值改变的时候会把原值复制一份给b,资料上好像叫"write to copy"

--------- 上面的观点不一定正确,希望大侠们能系统的解释一下。
 
另外,对于动态数组,variant又是什么情况呢? 怎么区别是赋值还是赋地址呢?
 
inttostr(integer(a))取的是Address吗?
 
动态数组你怎么用,按常理应该是用指针吧,然后代码中动态分配内存。
既然用的是指针,那么就是传指针。

至于怎么区别是赋值还是赋地址呢?原理很简单:
只要是需要在代码中分配内存、调用构造函数才能使用的变量,赋值的时候就是传指针;
如果那些只要定义好了就能用的变量,赋值的时候Delphi就会自动拷贝出一个新的副本。
 
谢谢各位高手参与,赋值在编程中是常见的,弄清道理对编高质量的程序非常重要,希望那位大侠能阐明道理。
 
to z_cd
function A: Array of Integer;
var
b: Array[0..2] of Integer;
begin
Result := b
该语句是赋的指针?
end;

 
to cheylin:
我认为是的,delphi的string类型是引用计数的,上面的赋值只是增加引用计数并没有分配新内存,很多书上专门讲到这一点,如果我没理解错的话 :)
另外,象a:=b如何区别是赋值还是赋地址?
 

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
顶部