技术交流,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. struts2中配置文件加载的顺序是什么?

    struts2的StrutsPrepareAndExecuteFilter拦截器中对Dispatcher进行了初始化 在Dispatcher类的init方法中定义了配置文件的加载顺序(下面是源码) p ...

  2. 【JMeter4.0学习(七)】之配置元素

    目录 CSV Data Set Config HTTP Cookie管理器 HTTP信息头管理器 JDBC Connection Configuration 用户定义的变量 计数器 一.CSV Dat ...

  3. 07 nginx Location之正则匹配

    一:Location之正则匹配 再来看,正则也来参与. location / { root   /usr/local/nginx/html; index  index.html index.htm; ...

  4. CSMA/CD解释与理解

    1. CSMA/CD含义 CSMA/CD即载波监听多点接入/碰撞检测,此协议是使用在总线型网络中的,不同计算机是通过多点接入的方式连接在一起.协议的重点在于监听和碰撞检测. 2. 为什么要监听和碰撞检 ...

  5. 【文献阅读】Perceptual Generative Adversarial Networks for Small Object Detection –CVPR-2017

    Perceptual Generative Adversarial Networks for Small Object Detection 2017CVPR 新鲜出炉的paper,这是针对small ...

  6. Android Studio 2.0 稳定版新特性介绍

    Android Studio 2.0 最终迎来了稳定版本号,喜大普奔. 以下这篇文章是2.0新特性的一些简介. 假设想看具体内容请看这里<Android Studio有用指南> 文章转自这 ...

  7. UGUI随记

    <color=#ffef00ff>武器</color>:巨剑 <color=#ffef00ff>种族</color>:人族 <color=#ffe ...

  8. 创建有提示的ui组件

    using UnityEditor; using UnityEngine; using System.Collections; using Edelweiss.CloudSystem; namespa ...

  9. PDP开发环境搭建

    1. 安装git 2.创建SSH-rsa钥匙 3. 写入 gitlab 4. 克隆分支 git clone  -b  dev_pdp_minz_ep_metting   git@gitlab.csvw ...

  10. C++模板类[初步]

    /* * stacktp.h * * Created on: 2014年3月29日 * Author: */ /** * - 模板类的概念,与使用 * -# export template <c ...