gpt4 book ai didi

arrays - 数组类型赋值如何工作?

转载 作者:行者123 更新时间:2023-12-03 15:44:54 25 4
gpt4 key购买 nike

我有以下代码:

type
PSuperListItem = ^TSuperListItem;
TSuperListItem = record
SubItems : array of String;
Marked : Boolean;
ImageIndex: Integer;
end;

TSuperListItems = array of PSuperListItem;

TMyList = class(TCustomControl)
public
Items, ItemsX : TSuperListItems;
procedure SwapItemLists;
end;

procedure TMyList.SwapItemLists;
var tmp:TSuperListItems;
begin
tmp:=Items; Items:=ItemsX; ItemsX:=tmp;
end;

我想知道我是否正确完成了 SwapItemLists 的分配。当我将 Items 分配给 tmp 时会发生什么?将创建 Items 的新副本,还是仅传递该变量的指针?

最佳答案

动态数组是引用类型。这意味着您只是交换了引用。不会复制数组的内容。

能够自己回答此类问题的关键是理解引用类型的含义。对于动态数组,动态数组类型的变量保存对数组的引用。这是通过动态数组变量作为指向数组的指针在幕后实现的。

考虑这段代码:

var
a, b: TArray<Integer>;
....
a := TArray<Integer>.Create(42);
b := a;
b[0] := 666;
Assert(a[0] = 666);
Assert(@a[0] = @b[0]);

在这段代码中,只有一个数组。变量ab 都引用该数组的同一个实例。

为了制作动态数组的副本,请使用 Copy来自系统单元的函数。

引用类型的其他示例包括类实例变量、接口(interface)变量、匿名方法和字符串。除了字符串之外,它们的行为都与动态数组类似。

字符串实现写时复制。这意味着,如果一个字符串对象有多个对其的引用,则通过引用进行的修改会导致在修改时生成一份副本。这具有使字符串数据类型在语义上表现得像值类型的效果。实际上,当您对字符串使用赋值时,该赋值在语义上与复制没有什么区别。但作为一种优化,字符串复制的实际实现被推迟到需要时为止。

关于arrays - 数组类型赋值如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27252514/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com