用指针复制数组

Copy array with pointers

我有数组

type
Ttable=array[0..7] of ^TRecord;
var
table:Ttable;

我想创建具有相同值的临时 tmp table,但是,临时更改不会影响正确的。

你能帮帮我吗?

您遇到的问题是,如果您复制 table 个指针,指针仍指向原始对象或记录,因此任何操作都会影响原始数据。

为避免这种情况,您需要复制原始记录,而不是指向它们的指针。您表明(但实际上并未声明)您使用的是记录而不是对象。不同之处在于新创建对象的处理 - 对于您不需要的记录,但对于您需要的对象。在您的情况下,您可能希望使数组永久化以供将来重用。

为了说明,我在表单中添加了 3 个备注字段。两个注意事项 - 您需要以某种方式创建第二组记录,重要的一点是 CopyTable

unit Unit2;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
  Unit3, Vcl.StdCtrls;

type
  TRecord = record
    Something : integer;
  end;

  TTable = array[0..7] of ^TRecord;

  TForm2 = class(TForm)
    Memo1: TMemo;
    Memo2: TMemo;
    Memo3: TMemo;
    procedure FormShow(Sender: TObject);
  private
    { Private declarations }
    Record0 : TRecord;
    Record1 : TRecord;
    Record2 : TRecord;
    Record3 : TRecord;
    Record4 : TRecord;
    Record5 : TRecord;
    Record6 : TRecord;
    Record7 : TRecord;
    TempRecord0 : TRecord;
    TempRecord1 : TRecord;
    TempRecord2 : TRecord;
    TempRecord3 : TRecord;
    TempRecord4 : TRecord;
    TempRecord5 : TRecord;
    TempRecord6 : TRecord;
    TempRecord7 : TRecord;
    fTempTable : TTable;
  public
    Table : TTable;
    { Public declarations }
    procedure CopyTable;
    procedure ShowTable( const ATable : TTable; const AMemo : TMemo );
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

{ TForm2 }

procedure TForm2.CopyTable;
var
  i: Integer;
begin
  for i := 0 to 7 do
  fTempTable[i]^ := Table[ i ]^;
end;

procedure TForm2.FormShow(Sender: TObject);
var
  i: Integer;
begin
  // Set up tables
  Table[0] := @Record0;
  fTempTable[0] := @TempRecord0;
  Table[1] := @Record1;
  fTempTable[1] := @TempRecord1;
  Table[2] := @Record2;
  fTempTable[2] := @TempRecord2;
  Table[3] := @Record3;
  fTempTable[3] := @TempRecord3;
  Table[4] := @Record4;
  fTempTable[4] := @TempRecord4;
  Table[5] := @Record5;
  fTempTable[5] := @TempRecord5;
  Table[6] := @Record6;
  fTempTable[6] := @TempRecord6;
  Table[7] := @Record7;
  fTempTable[7] := @TempRecord7;
  for i := 0 to 7 do
  begin
    Table[i]^.Something := i;
  end;
  ShowTable( Table, Memo1 );
  CopyTable;
  fTempTable[ 5 ].Something := 73;
  ShowTable( fTempTable, Memo2 );
  ShowTable( Table, Memo3 );
end;

procedure TForm2.ShowTable(const ATable: TTable; const AMemo: TMemo);
var
  i: Integer;
begin
  AMemo.Clear;
  for i := 0 to 7 do
  begin
    AMemo.Lines.Add( IntToStr( ATable[i]^.Something));
  end;
end;

end.