procedure TForm4.Button1Click(Sender: TObject);
var
//动态数组
bytes1,bytes2: TBytes;
//静态数组
bytes3,bytes4: array[..] of Byte;
i: Integer;
abc: string;
begin
//初始化赋值
abc := 'ab好';
bytes1 := WideBytesOf(abc);
for I := to do
begin
bytes3[I] := I;
end; {
根据我的猜测delphi内部最终是拿到了数组首元素的内存编号
(静态数组变量本身就是,动态数组的话传递首元素的值(要解密得解开汇编代码))
结论:最终move函数的前两个参数的内部的汇编代码,可能就是拿到堆中数据首元素的内存编号
} //1.动态数组复制到动态数组(规定:前两个参数传递数组首元素的值)
SetLength(bytes2, Length(bytes1));
Move(bytes1[], bytes2[], Length(bytes1)); //2.动态数组复制到静态态数组(两种写法都可以为了与动态数组统一,推荐用[0]的方法)
Move(bytes1[], bytes3[], Length(bytes1));
//Move(bytes1[0], bytes3, Length(bytes1)); //3.静态数组复制到静态态数组(两种写法都可以为了与动态数组统一,推荐用[0]的方法)
Move(bytes3[], bytes4[], Length(bytes3));
//Move(bytes3, bytes4, Length(bytes3));
end; procedure testByte(b: Byte);
var
pp: Pointer;
begin
//如果是普通函数的话,你会发现是值传递,但是move函数的原型 windows下是汇编,所以不会按常规出牌.
//与Pointer(@b1[0]);不同
pp := Pointer(b);
end; procedure TForm4.Button2Click(Sender: TObject);
var
bs: TBytes;
begin
bs := BytesOf('abc');
testByte(bs[]);
end; procedure TForm4.Button3Click(Sender: TObject);
var
b1: TBytes;
p1,p2,p3,p4: Pointer;
begin
b1 := BytesOf('abc'); p1 := Pointer(b1);//栈中内存的值即堆中的地址
p2 := Pointer(@b1[]);//首元素的地址就是变量本身,同Pointer(b1)一样(我猜测move函数让传入 b1[0],其实他内部就是拿到堆中数据首元素的地址)
p3 := Pointer(b1[]);//首个元素的值转成了pointer类型
p4 := Pointer(Pbyte(b1)^);//首元素的值转成了pointer类型.$61 = 1 + 16 * 6 = 97(a)
end;

知识点1:

静态数组与动态数组的内存存储是不同的,静态数组仅存在于栈内 或 仅存在于堆内,就是说是没有 栈中指针 堆中数据这个说法的。

而动态数组是栈中存变量指针,堆中存数据的。

知识点2:

bytesof是把字符串中的值转成ascii码表中的10进制值来表示的,因为毕竟Byte是整型嘛;

wideBytesof 是转成双字节的,若是英文的话,双字节中的第一个字节存值,第二个字节填充为0;中文的话 就是unicode编码 两个字节肯定都有值的。

知识点3:

静态数组为什么这两句写法都行,move函数的2个参数是需要传递数据的首元素的值,我猜测最终的目的是拿到堆中数据首元素的内存编号。对于静态数组而言,数组变量本身就是数据的起始指针。

而对于动态数据而言,bytes1(栈中内存块数据--也可以叫做栈中指针),@bytes1[0] 就是堆中数据的起始地址了;元素首元素的地址 就是 变量本身;

知识点4:

move其实也是copy内存,我猜想copy的话 应该比 转移更快的原因,因为转移的话 就是 拿走后 还得销毁 浪费时间。因为出栈后 程序会自动销毁,所以干嘛不复制呢。

关于群里的讨论:太长略了,结论:

无论静态数组还是动态数组都这样玩(带[0]),保证没错。

Move(bytes1[0], bytes2[0], Length(bytes1));

关于move的更多相关文章

  1. [LeetCode] Move Zeroes 移动零

    Given an array nums, write a function to move all 0's to the end of it while maintaining the relativ ...

  2. 记录一则ORACLE MOVE操作后重建索引过程被强制中断导致的ORA-8104案例

    环境:SunOS + Oracle 11.2.0.3   对部分表进行Move操作之后,未重建对应的索引,会导致ORA-1502 索引不可用. 此时需要用下面的查询拼接出重建不可用索引的sql语句: ...

  3. Error Domain=ASIHTTPRequestErrorDomain Code=8 "Failed to move file from"xxx/xxx"to"xxx/xxx"

    今天真的好高兴呀 我解决了一个折磨了我一周的问题,真的是激动地要哭出来了,为了这个问题,我嘴也烂了,头发抓了一地啊.虽然解决方法,最后还是展现出了“百度”的伟大,但是我还是很开心,在这里我展示一下我的 ...

  4. LeetCode:Move Zeroes

    LeetCode:Move Zeroes [问题再现] Given an array nums, write a function to move all 0's to the end of it w ...

  5. PHP中调用move_uploaded_file函数提示failed to open stream和 Unable to move

    在做一个PHP文件上传系统的时候,使用move_uploaded_file进行文件上传,提示下面两个warning,不能成功上传文件 Warning: move_uploaded_file(uploa ...

  6. Leetcode Move Zeros

    Given an array nums, write a function to move all 0's to the end of it while maintaining the relativ ...

  7. svn更改分支名字,move命令

    名称 svn move — 移动一个文件或目录. 概要 svn move SRC DST 描述 这个命令移动文件或目录到你的工作拷贝或者是版本库. 提示 这个命令同svn copy加一个svn del ...

  8. LeetCode 283 Move Zeros

    Problem: Given an array nums, write a function to move all 0's to the end of it while maintaining th ...

  9. C++11 feature: move constructor

    There are heaps of good articles out there about C++ features including this move constructor. Howev ...

  10. [LintCode] Move Zeroes 移动零

    Given an array nums, write a function to move all 0's to the end of it while maintaining the relativ ...

随机推荐

  1. 基于Java visualvm的可视化监控的使用

    1 Java visualVM可视化监控工具打开方式 ctrl + r 快捷键调出运行窗口,输出 jvisualvm指令,即可打开java visualVM工具.详情如下图: 2 Java Visua ...

  2. 交互式shell脚本对话框----whiptail指令

    当你在linux环境下setup软件的时候就会有相应的对话框让你输入.虽然我们已经习惯了这种交互的方法,但是如果有一种直观的界面来输入是不是会更加友好和方便呢,在shell脚本中你可以使用-whipt ...

  3. Visual Studio 2013打开项目出现“未安装项目的目标框架”提示

    问题描述: windows 10 系统里用Visual Studio 2013打开项目,提示如下: 说项目的.NET Framework version=v4.5,系统里没装,让将项目的框架从v4.5 ...

  4. Python面向对象补充以及异常处理

    面向对象相关内容 一.isinstance(obj, cls) 检查是否obj是否是类 cls 的对象 class Foo(object): pass obj = Foo() isinstance(o ...

  5. ElasticStack系列之十四 & ElasticSearch5.x bulk update 中重复 id 性能骤降

    目前在绝对多数公司在使用 ElasticSearch 将其当做数据库使用,将多个数据库中的数据同步到 ElasticSearch 索引是非常常见的应用场景.那么自然而然就会涉及到数据频繁的新增和更新, ...

  6. 序列内第k小查询(线段树)

    最近请教了一下大佬怎么求序列内第k大查询,自己又捣鼓了一下,虽然还没有懂得区间第k大查询,不过姑且做一个记录先吧 因为每个元素大小可能很大而元素之间不连续,所以我们先离散化处理一下,程序中的ori[ ...

  7. windows安装filebeat服务报错

    cmd进入filebeat目录下   用以下命令执行: PowerShell.exe -ExecutionPolicy UnRestricted -File .\install-service-fil ...

  8. 何凯文每日一句打卡||DAY1~DAY3

    01长难句 In an open meeting with congressional Democrats and Republicans, Trump embraced raising the ag ...

  9. 针对TCP连接异常断开的分析

    我们知道,一个基于TCP/IP的客户端-服务器的程序中,正常情况下,我会是启动服务器使其在一个端口上监听请求,等待客户端的连接:通过TCP的三次握手,客户端能够通过socket建立一个到服务器的连接: ...

  10. javamail模拟邮箱功能--邮件回复-中级实战篇【邮件回复方法】(javamail API电子邮件实例)

    引言: JavaMai下载地址l jar包:http://java.sun.com/products/javamail/downloads/index.html 此篇是紧随上篇文章而封装出来的,阅读本 ...