Handbook之014:动态数组的复制

动态数组直接 := 赋值给新数组,那么这2个数组还是同一个数组,修改任意一个数组成员值,另外一个数组也跟随着变化。

如果动态数组用Copy赋值,那么则不会跟着随动变化

 

代码如下:

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
uses
  System.Diagnostics,
  System.Math;

type
  TDays = array of Integer;
//函数定义

procedure ShowStaticArrays();
var
  m_Day: TDays;
  m_Day1, m_Day2: TDays;
  I: Integer;
begin
  SetLength(m_Day, 3);
  for I := Low(m_Day) to High(m_Day) do
  begin
    m_Day[I] := I;
  end;

  m_Day1 := m_Day;     // 会修改原数组结果
  m_Day2 := Copy(m_Day, Low(m_Day), Length(m_Day));// 不会修改原数组结果

  m_Day1[1] := 520;
  m_Day2[2] := 3344;

  for I := Low(m_Day) to High(m_Day) do
  begin
    Form1.Memo1.Lines.Add(‘m_Day[‘ + I.ToString + ‘] := ‘ + m_Day[I].ToString);
  end;
  for I := Low(m_Day) to High(m_Day) do
  begin
    Form1.Memo1.Lines.Add(‘m_Day1 [‘ + I.ToString + ‘] := ‘ + m_Day1[I].ToString);
  end;
  for I := Low(m_Day) to High(m_Day) do
  begin
    Form1.Memo1.Lines.Add(‘m_Day2 [‘ + I.ToString + ‘] := ‘ + m_Day2[I].ToString);
  end;
end;

//计时
procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowStaticArrays();
end;

end.
时间: 2024-10-27 02:20:10

Handbook之014:动态数组的复制的相关文章

Handbook之015:动态数组相加

动态数组支持直接相加,方法如下: 代码如下: unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls; type TForm1 = class(TForm) Memo1: TMemo; Button1: T

动态数组索引越界问题

1.在C++中,可以采用几种不同的方法创建一个某种类型T的对象的数组.3种常用的方法如下: #define N 10 //数组的长度N在编译时已知 T static_array[10]; int n = 20; //数组的长度n是在运行时计算的 T* dynamic_array = new T[n]; std::vector<T> vector_array; //数组的长度可以在运行时进行修改 当然,我们仍然可以使用calloc()和malloc()函数,并且这样的程序仍然能够通过编译并顺利运

C#语言中的动态数组(ArrayList)模拟常用页面置换算法(FIFO、LRU、Optimal)

目录 00 简介 01 算法概述 02 公用方法 03 先进先出置换算法(FIFO) 04 最近最久未使用(LRU)算法 05 最佳置换算法(OPT) 00 简介 页面置换算法主要是记录内存的忙闲状态,为进程分配和释放内存.当主存的空间太小而无法装入所有的进程时,就需要在内存和硬盘之间进行调度操作. 多数操作系统只采用某种特定的页面置换算法进行置换,无法预先探测当前运行进程的页面访问模式,因此不能根据不同的页面访问模式,选用不同的页面置换算法.当然,如果能对不同的访问模式选取相应的页面置换算法,

动态数组vector

动态数组 动态数组可以实现长度的自由变化,但是通过vector的默认值可以基本判断所谓动态数组实际上还是一个普通数组,传递一个参数确定数组长度,如果没有传递参数,程序中其实默认进行设定.如果插入数据之后超过了已有长度,则在内部进行了一个创建第三方的过程,将现在的数组保存起来,然后再次创建一个新的长度的数组,然后根据插入值进行重新整合. 笔者并未看过源码,只是按照功能试着进行实现. 1.array.h 1 #pragma once 2 3 #include <iostream> 4 using

修饰符(动态数组篇)

1.无修饰符----要看成员变量的类型,与基本类型不一致,是直接传基本类型的地址过来,并没有把基本类型的指针复制一份入栈,所以一旦修改就是修改原来的值. 2.const 修饰符 与 无修饰符一致. 3.var修饰符 与 上一致. 4.out修饰符(不要初始化,初始化也没有意义) unit Unit4; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,

【8.0】关于Java和c的动态数组问题

1.java: java本身是没办法实现动态数组的,这个java本身不直接操作指针有关系[虽然我觉得理论上应该是和c一样,可以办到的,但java不提供,具体原因等知道了再补充].那么java的集合例如ArrayList集合这样的是如何实现"动态数组"的呢.其实原理是:ArrayList的底层是一个数组a[Object[] a = new Object[]], 如果需要改变ArrayList的大小,则丢弃ArrayList原先对a的引用, 然后new一个新的数组[ Object[] b

第十章 动态数组

当写下这个题目的时候,笔者心里其实非常犯难.因为从本质上来说,本章想阐述的内容与题目所宣示的概念,其实是不一样的.在编程中,我们常常要处理一段长度未知的数据,而且,运行过程中长度可能会发生变化,现行的C/C++标准没有提供在栈段和数据段内存中的实现,只提供堆中的实现,例如可以象下面代码那样在堆中分配一段内存,以处理一组长度不确定的整数: int *p = ( int* )malloc( n * sizeof( int ) ); 现在我们常常将这段堆内存称为“动态数组”.这正确吗?数组是一个高层概

C++数组怎么复制

C++数组怎么复制: #include <string.h>main(){int a[10]={34,56,4,10,77,51,93,30,5,52};int b[10];memcpy(b,a,sizeof(b));} 这样就行了~ C++如何把一个动态数组复制到另一个动态数组中去: int *p1=new int[100];for(int i=0;i<100;++i)pi[i]=i+1;int *p2=new int[100];memmove(p2,p1,sizeof(int)*10

C++实现的动态数组

第一次写博客,好紧张... 暑假在家学习STL,想要自己动手实现一下动态数组(实际上有很大区别,比如动态数组的地址值是固定的.一旦创建容量有上限.然而我自己实现的是地址也跟着随机分配的"动态数组"...),话不多说上源码: #include<iostream> using namespace std; class D_array { private: int *a; int n; public: D_array(); D_array(const D_array &