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

  • 主题发起人 zhaogh_2171
  • 开始时间
我倒是觉得只要基于引用计数的类型,比如string,动态数组、interface等,象进行b:=a 这样的赋值时应该不分配新空间。其它的就不好说了。
另外 variant呢?
 
to 迷糊
function A: Array of Integer;
var
b: Array[0..2] of Integer;
begin
Result := b
该语句是赋的指针?
end;
 
Result := b
//这样就不能赋,应该Result:=@b
-------- 这个问题我是真迷糊了:) 希望别急着结贴,听听大侠们的看法
 
Result := b是赋值而不是赋指针。迷糊可真是够迷糊的,呵呵,不要想当然!
 
呵呵,是该弄明白.
 
to zhaogh_2171:
Result := b
该语句是赋值的。
因为b: Array[0..2] of Integer你定义完了就可以用了呀,不需要你再写一句代码分配内存什么的,这样说还不明白吗?
 
to z_cd
首先,谢谢你的回答。但我不知道那个赋值句是需要写分配内存语句的。请举例说明。
 
>>Result := b
该语句是赋值的。
1、这句编译是通不过的,因为这里result是动态数组,b是静态数组,大家先试试再说,不要想当然 :)
2、result是动态数组的话那他是不是应该是个指针?如果是的话那赋值之说。。。
to z_cd: 如大侠所言,
>>只要是需要在代码中分配内存、调用构造函数才能使用的变量,赋值的时候就是传指针;
>>如果那些只要定义好了就能用的变量,赋值的时候Delphi就会自动拷贝出一个新的副本。
因为delphi中有些变量不需要在代码中显式的分配内存,比如string,variant(不知算不算), 所以我觉得这样判断也不完美。
--------呵呵,我是真迷糊,真正迷糊:)
 
sorry
我写个代码给大家看看分析分析好么?
procedure TForm1.Button1Click(Sender: TObject);

function do1(A:array of Integer): TIntegerDynArray;
begin
System.SetLength(Result, 3);
Result[0] := A[0];
Result[1] := A[1];
Result[2] := A[2];
end;

var
A: Array[0..2] of Integer;
B: TIntegerDynArray;
C: TIntegerDynArray;
I: Integer;
begin
A[0] := 1;
A[1] := 2;
A[2] := 3;
B := do1(A)
赋值?指针么?
C := do1(A)
赋值?指针么?
for I := 0 to 2 do
begin
Showmessage(Inttostr(B));
end;
end;

 
to 迷糊
我做过测试不是指针。

下面的是指针

function do1: TIntegerDynArray;
var
A: TIntegerDynArray;
begin
System.SetLength(A, 3);
A[0] := 1;
A[1] := 2;
A[2] := 3;
Result := A;是指针
end;


procedure TForm1.Button1Click(Sender: TObject);
var
B: TIntegerDynArray;
C: TIntegerDynArray;
D: TIntegerDynArray;
I: Integer;
begin
B := do1;是指针
D := B;是指针
C := D
是指针
end;
z_cd 说的对动态数组赋值是指针。
 
不同意上面的观点,不论简单变量,数组,对象
a:=x;
b:=a;
这样的符值内存中只有一份,当a的值改变的时候会把原值复制一份给b。
------我记得是这样的

记错了。
简单数据类型的=号是复制值后给的,对新的数据跟原数据没关系了。只有复杂类型的才是将指针地址复制给新变量,此时如果要实现真正的值复制要通过一个函数自己对每一个分量或属性复制值。
我也刚学,错了大家指出来吧
 
to zhaogh_2171:
>>我做过测试不是指针。---你是怎么测试的 ?
你的 TIntegerDynArray类型的定义在什么地方?因为我看到了这一句:System.SetLength(Result, 3)
所以我认为它是动态数组。而你的代码里
。。。
B: TIntegerDynArray
// 这里
C: TIntegerDynArray
// 这里
I: Integer;
begin
A[0] := 1;
A[1] := 2;
A[2] := 3;
B := do1(A)
赋值?指针么?
C := do1(A)
赋值?指针么?
。。。。
>>z_cd 说的对动态数组赋值是指针。 这不是动态数组吗?

to sward:
不要老揪住那几句话不撒手吗?我都已经说了我记错了吗?
-----加一句我只认为对简单变量我记错了,其他的不见得
 
但是前面几位提到的我还是不同意:
>>a的值变化时b没有随着a变化,就说明在b:=a;时会给b分配新的内存块
>>只要是需要在代码中分配内存、调用构造函数才能使用的变量,赋值的时候就是传指针

另外为什么没有人解释一下variant呢?
 
TIntegerDynArray delphi自带的。
 
楼主在抬杠了。。。
 
to crazyboy
我没有抬杠,你为什么这样说呢?
 
看一下刘艺的《DELPHI面向对象编程》吧
 
to 来自:迷糊,
>>看来我是真的记错了,不过 大侠不要光一句话否定我的观点,
>>能不能讲讲其中的原委,在下不胜感激
>>我再解释一下我的观点:
>>var
>> a,b:tlist

>> a:=tlist.create;
>> b:=a;
>>这样的赋值肯定内存中只有一份吧。

要是我这样呢:
var
a,b:tlist

a:=tlist.create;
b:=tlist.create;
b:=a;
还是一份吗?那么B原来的内存不就收不回来了?
 
var a,b:string;
begin
a:='123';
b:=a ;
a:='321';
showmessage(a+'|'+b);
结果是“321|123”
 

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