文档章节

复制动态数组

涂孟超
 涂孟超
发布于 2014/09/26 15:30
字数 368
阅读 5
收藏 0
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

type
  TArr = array of Int64; {先把需要的动态数组数组定义成一个类型, 因为下面需要类型转换}
var
  arr1,arr2: TArr;       {两个等待测试的数组变量}
  p: Pointer;            {该指针用于中转数组中的数据}

{先给第一个数组赋测试值}
procedure TForm1.FormCreate(Sender: TObject);
var
  i: Integer;
begin
  for i := 0 to 1000 - 1 do
  begin
    SetLength(arr1, Length(arr1)+1);
    arr1[High(arr1)] := i * 2;
  end;
  {抽查显示}
  ShowMessage(IntToStr(arr1[9])); {18}
end;

{复制到第二个数组}
procedure TForm1.Button1Click(Sender: TObject);
var
  size: Cardinal;
begin
  size := Length(arr1) * SizeOf(arr1[0]); {源数组大小}
  GetMem(p, size);                        {根据源数组大小分配内存}
  CopyMemory(p, arr1, size);              {复制}
  arr2 := TArr(p);                        {转换}
  {抽查显示}
  ShowMessage(IntToStr(arr2[9]));         {18}
end;

end.

 
 
 
 
 

 

 

  

假定数组元素是个结构, 再测试一次:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

type
  TRec = record
    str: string;
    int: Integer;
  end;

  TArr = array of TRec;

var
  arr1,arr2: TArr;
  p: Pointer;

procedure TForm1.FormCreate(Sender: TObject);
var
  i: Integer;
begin
  for i := 0 to 1000 - 1 do
  begin
    SetLength(arr1, Length(arr1)+1);
    arr1[High(arr1)].str := IntToStr(i);
    arr1[High(arr1)].int := i * 2;
  end;
  ShowMessageFmt('%s,%d',[arr1[9].str, arr1[9].int]); {9,18}
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  size: Cardinal;
begin
  size := Length(arr1) * SizeOf(arr1[0]);
  GetMem(p, size);
  CopyMemory(p, arr1, size);
  arr2 := TArr(p);
  ShowMessageFmt('%s,%d',[arr2[9].str, arr2[9].int]); {9,18}
end;

end.

 
 
 
 
 

 

 

  

本文转载自:http://www.cnblogs.com/del/archive/2008/10/14/1310583.html

涂孟超
粉丝 12
博文 2011
码字总数 14107
作品 0
深圳
程序员
私信 提问
C++实现的动态数组

第一次写博客,好紧张。。。 暑假在家学习STL,想要自己动手实现一下动态数组(实际上有很大区别,比如动态数组的地址值是固定的、一旦创建容量有上限。然而我自己实现的是地址也跟着随机分配...

pasilo
2017/07/17
0
0
jdk源码阅读笔记-ArrayList

一、ArrayList概述 首先我们来说一下ArrayList是什么?它解决了什么问题?ArrayList其实是一个数组,但是有区别于一般的数组,它是一个可以动态改变大小的动态数组。ArrayList的关键特性也是...

编程SHA
2018/11/11
20
0
Go性能优化技巧 1/10

字符串(string)作为一种不可变类型,在与字节数组(slice, [ ]byte)转换时需付出 “沉重” 代价,根本原因是对底层字节数组的复制。这种代价会在以万为单位的高并发压力下迅速放大,所以对...

雨痕学堂
2016/04/26
315
0
ArrayList (JDK8) 源码解析

ArrayList 源码解析 概述 ArrayList 是一个动态数组,容量可以动态增长。他是线程不安全的,允许元素为null。它的底层数据结构是数组,所以会占用一块连续的内存空间。它实现了 接口。 代表L...

sun_____xin
2018/04/04
0
0
ArrayList & Vector (transient关键字)

ArrayList & Vector (transient) 集合是Java中非常重要而且基础的内容,因为任何数据必不可少的就是数据的存储。集合的作用就是以一定的方式组织、存储数据。下面说说ArrayList,只捡干货聊...

大白来袭
2017/06/04
24
0

没有更多内容

加载失败,请刷新页面

加载更多

MySQL左连接问题,右表做筛选,左表列依然在

两张表,一张user表,一张user_log表 CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(20) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFA......

bengozhong
6分钟前
2
0
重新开始学Java——多线程基础

多线程 进程 主流计算机操作系统都支持同时运行多个任务 , 每个任务通常就是一个程序 , 每个运行中的程序就是一个进程或者多个进程 。 进程的特点 独立性 进程是系统中独立存在的实体 可以...

大家都是低调来的
7分钟前
1
0
注解在Java中是如何工作的?

> 来一点咖啡,准备好进入注解的世界。 注解一直是 Java 的一个非常重要的部分,它从 J2SE 5.0 开始就已经存在了。在我们的应用程序代码中,经常看到 @Override 和 @Deprecated 这样的注解。...

liululee
10分钟前
3
0
Docker 容器连接

Docker 容器连接 容器间的链接有两种方法,你选择其一即可 网络端口映射 docker run -d -P docker run -d -p-P :是容器内部端口随机映射到主机的高端口。-p : 是容器内部端口绑定到指定...

测者陈磊
13分钟前
2
0
车载导航应用中基于Sketch UI主题定制方案的实现

1.导读 关于应用的主题定制,相信大家或多或少都有接触,基本上,实现思路可以分为两类: 内置主题(应用内自定义style) 外部加载方式(资源apk形式、压缩资源、插件等) 其实,针对不同的主题...

阿里云官方博客
18分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部