技术交流,DH讲解.

记得很早之前我就说过,数组和结构体在内存中其实一样的,他们都是连续分布的.
例如:

1
2
3
4
TMyStruct = record
  A,B,C:Integer;
end;
T3IntArray = array[0..2]of Integer;

这两个都占12字节,而且TMyStruct.A就是T3IntArray[0].
而我们知道在访问数组中某个元素的时候,只是在第一个元素的地址 + 序号 * 元素大小.
那么访问结构体应该也是这样的,只是结构体中每个元素的大小不一定都是一样的,而数组中每个元素都是一样的.
好的我们来看段代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
type
    TMyStruct = record
      A,B,C:Integer;
    end;
    T3IntArray = array[0..2]of Integer;
    PMyStruct = ^TMyStruct;
 
procedure TForm2.Button2Click(Sender: TObject);
var
  aArray:array[0..99] of Byte;
  P:PMyStruct;
  I: Integer;
begin
  P:=PMyStruct(@aArray[0]);
  for I := 0 to 5 - 1 do
  begin
    P^.A:=55;
    P^.B:=66;
    P^.C:=77;
    Inc(P);
  end;
end;

其实这个P我们相当于定义一个TMyStruct的数组,有5个元素,但是我们定义的是一个指针,而且没有分配空间,我是在aArray的空间上面使用.
也就是过程结束的时候,aArray空间被收回,那么P也就消失了.看看反汇编代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
utMain.pas.143: P:=PMyStruct(@aArray[0]);
004B6ACB 8BC4             mov eax,esp
utMain.pas.144: for I := 0 to 5 - 1 do
004B6ACD BA05000000       mov edx,$00000005 //循环变量
utMain.pas.146: P^.A:=55;
004B6AD2 C70037000000     mov [eax],$00000037 //对A赋值55
utMain.pas.147: P^.B:=66;
004B6AD8 C7400442000000   mov [eax+$04],$00000042 //对B赋值66
utMain.pas.148: P^.C:=77;
004B6ADF C740084D000000   mov [eax+$08],$0000004d //对C赋值
utMain.pas.149: Inc(P);
004B6AE6 83C00C           add eax,$0c //移动指针,一个TMyStruct的大小是3*4=12=$0c
utMain.pas.144: for I := 0 to 5 - 1 do
004B6AE9 4A               dec edx
004B6AEA 75E6             jnz $004b6ad2

很清楚的看到了,访问和修改结构体中某个元素的值,也是在结构体指针上面进行偏移.
好的,下一次看看枚举.
放假了.在家米有网了.好好学习一下.

Delphi - 数组和结构体的更多相关文章

  1. 全面总结sizeof的用法(定义、语法、指针变量、数组、结构体、类、联合体、位域位段)

    一.前言 编译环境是vs2010(32位). <span style="font-size:18px;">#include<iostream> #inclu ...

  2. 【原创】只学到二维数组和结构体,不用链表也能写一个C贪食蛇?(四)

    全系列Index: [原创]只学到二维数组和结构体,不用链表也能写一个C贪食蛇?(一) [原创]只学到二维数组和结构体,不用链表也能写一个C贪食蛇?(二) [原创]只学到二维数组和结构体,不用链表也能 ...

  3. C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com

    原文:C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | I ...

  4. 5、数组&字符串&结构体&共用体&枚举

    程序中内存从哪里来 三种内存来源:栈(stack).堆(heap).数据区(.date): 栈(stack) 运行自动分配.自动回收,不需要程序员手工干预: 栈内存可以反复使用: 栈反复使用后,程序不 ...

  5. matlab学习笔记12_3串联结构体,按属性创建含有元胞数组的结构体,filenames,isfield,isstruct,orderfields

    一起来学matlab-matlab学习笔记12 12_3 结构体 串联结构体,按属性创建含有元胞数组的结构体,filenames,isfield,isstruct,orderfields 觉得有用的话 ...

  6. C语言一维数组、二维数组、结构体的初始化

    C语言数组的初始化表示方法 一.C语言一维数组初始化: (1)在定义数组时对数组元素赋以初值.如: static int a[10]={0,1,2,3,4,5,6,7,8,9}; 经过上面的定义和初始 ...

  7. Delphi 中的结构体与结构体指针

    好多程序都给结构体变量设定了一个结构体指针 例如: PAbc = ^TAbc; TAbc = record a: string[10]; b: string[5]; c: string[1]; end ...

  8. c#---部分;把数组或者结构体存入集合里,然后再从集合中取出之后,输出;foreach既可以用到提取数组重点额数据,也可以提取集合中的数据(前提是集合中的元素是相同数据类型)

    1.输入班级人数,统计每个人的姓名,性别,年龄:集合与数组 //Console.Write("请输入班级人数:"); //int a = int.Parse(Console.Rea ...

  9. c语言学习之基础知识点介绍(十七):写入读取结构体、数组、结构体数组

    一.结构体的写入和读取 //写入结构体 FILE *fp = fopen("/Users/ios/Desktop/1.data", "w"); if (fp) ...

随机推荐

  1. 好文章收藏--五分钟理解一致性哈希算法(consistent hashing)

    一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似.一致性哈希修正了CARP使用的简 单哈 ...

  2. 【React Native开发】React Native配置执行官方样例-刚開始学习的人的福音(8)

    ),React Native技术交流4群(458982758),请不要反复加群! 欢迎各位大牛,React Native技术爱好者加入交流!同一时候博客左側欢迎微信扫描关注订阅号,移动技术干货,精彩文 ...

  3. centos7.0安装redis扩展

    1.下载 下载地址:https://github.com/phpredis/phpredis/ 文件名:phpredis-develop.zip 文件下载成功后,上传至/usr/local 2.安装 ...

  4. 深入解读DevOps 开发-运维

    历史回顾 为了能够更好的理解什么是DevOps,我们很有必要对当时还只有程序员(此前还没有派生出开发者,前台工程师,后台工程师之类)这个称号存在的历史进行一下回顾. 如编程之道中所言: 老一辈的程序员 ...

  5. D - Invitation Cards

    D - Invitation Cards Time Limit:8000MS     Memory Limit:262144KB     64bit IO Format:%lld & %llu ...

  6. SpringMVC拦截器实现登录认证

    项目结构如图: 需要的jar:有springMVC配置需要的jar和jstl需要的jar SpringMVC包的作用说明: aopalliance.jar:这个包是AOP联盟的API包,里面包含了针对 ...

  7. mongo explain分析详解

    1 为什么要执行explain,什么时候执行 explain的目的是将mongo的黑盒操作白盒化. 比如查询很慢的时候想知道原因. 2 explain的三种模式 2.1 queryPlanner 不会 ...

  8. React-Native 安装改变镜像

    3.安装完node后建议设置npm镜像以加速后面的过程,否则后面插件安装巨慢 npm config set registry https://registry.npm.taobao.org --glo ...

  9. This instability is a fundamental problem for gradient-based learning in deep neural networks. vanishing exploding gradient problem

    The unstable gradient problem: The fundamental problem here isn't so much the vanishing gradient pro ...

  10. HTML-Table-Td固定宽度使内容换行

    table style="TABLE-LAYOUT: fixed;" td style="WORD-WRAP: break-word;WIDTH:200px;"