Delphi - 数组和结构体
技术交流,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,esputMain.pas.144: for I := 0 to 5 - 1 do004B6ACD BA05000000 mov edx,$00000005 //循环变量utMain.pas.146: P^.A:=55;004B6AD2 C70037000000 mov [eax],$00000037 //对A赋值55utMain.pas.147: P^.B:=66;004B6AD8 C7400442000000 mov [eax+$04],$00000042 //对B赋值66utMain.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=$0cutMain.pas.144: for I := 0 to 5 - 1 do004B6AE9 4A dec edx004B6AEA 75E6 jnz $004b6ad2 |
很清楚的看到了,访问和修改结构体中某个元素的值,也是在结构体指针上面进行偏移.
好的,下一次看看枚举.
放假了.在家米有网了.好好学习一下.
Delphi - 数组和结构体的更多相关文章
- 全面总结sizeof的用法(定义、语法、指针变量、数组、结构体、类、联合体、位域位段)
一.前言 编译环境是vs2010(32位). <span style="font-size:18px;">#include<iostream> #inclu ...
- 【原创】只学到二维数组和结构体,不用链表也能写一个C贪食蛇?(四)
全系列Index: [原创]只学到二维数组和结构体,不用链表也能写一个C贪食蛇?(一) [原创]只学到二维数组和结构体,不用链表也能写一个C贪食蛇?(二) [原创]只学到二维数组和结构体,不用链表也能 ...
- C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com
原文:C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | I ...
- 5、数组&字符串&结构体&共用体&枚举
程序中内存从哪里来 三种内存来源:栈(stack).堆(heap).数据区(.date): 栈(stack) 运行自动分配.自动回收,不需要程序员手工干预: 栈内存可以反复使用: 栈反复使用后,程序不 ...
- matlab学习笔记12_3串联结构体,按属性创建含有元胞数组的结构体,filenames,isfield,isstruct,orderfields
一起来学matlab-matlab学习笔记12 12_3 结构体 串联结构体,按属性创建含有元胞数组的结构体,filenames,isfield,isstruct,orderfields 觉得有用的话 ...
- C语言一维数组、二维数组、结构体的初始化
C语言数组的初始化表示方法 一.C语言一维数组初始化: (1)在定义数组时对数组元素赋以初值.如: static int a[10]={0,1,2,3,4,5,6,7,8,9}; 经过上面的定义和初始 ...
- Delphi 中的结构体与结构体指针
好多程序都给结构体变量设定了一个结构体指针 例如: PAbc = ^TAbc; TAbc = record a: string[10]; b: string[5]; c: string[1]; end ...
- c#---部分;把数组或者结构体存入集合里,然后再从集合中取出之后,输出;foreach既可以用到提取数组重点额数据,也可以提取集合中的数据(前提是集合中的元素是相同数据类型)
1.输入班级人数,统计每个人的姓名,性别,年龄:集合与数组 //Console.Write("请输入班级人数:"); //int a = int.Parse(Console.Rea ...
- c语言学习之基础知识点介绍(十七):写入读取结构体、数组、结构体数组
一.结构体的写入和读取 //写入结构体 FILE *fp = fopen("/Users/ios/Desktop/1.data", "w"); if (fp) ...
随机推荐
- 推荐扔物线的HenCoder Android 开发进阶系列 后期接着更新
官网地址:http://hencoder.com/ 我来做一次辛勤的搬运工 HenCoder:给高级 Android 工程师的进阶手册 HenCoder Android 开发进阶: 自定义 View ...
- Nginx+tomcat集群中,session的共享
nginx,tomcat集群后多个session分配到同一个应用 单节点低负荷的情况下,我们通常把一个WEB应用打成WAR包放WEB应用服务器,如TOMCAT下运行就行了(如图1).但随着用户量的增加 ...
- ICloneable接口 Clone 深拷贝 浅拷贝
需要字段本身也实现了深拷贝Clone.应用场景不多,意义不大. 1. 隐含式地要求其子类和引用类也要实现ICloneable接口,如果引用层次比较深类似一个网状或树形接口,增加复杂性. 2. 考虑给s ...
- 查找 TextBox 对象中非法数据的示例
private void GetErrors(StringBuilder sb, DependencyObject obj){ foreach (object child in LogicalTree ...
- Lumen开发:lumen源码解读之初始化(3)——单例(singleton)与中间件(Middleware)
版权声明:本文为博主原创文章,未经博主允许不得转载. 今天来讲讲Lumen的singleton和Middleware,先来看看起始文件bootstrap/app.php / * | --------- ...
- [JavaScript] Imitate String.Format() in c#
Definition if (!String.prototype.format) { String.prototype.format = function () { var args = argume ...
- 【BZOJ3333】排队计划 树状数组+线段树
[BZOJ3333]排队计划 Description Input Output Sample Input 6 2 160 163 164 161 167 160 2 3 Sample Output 6 ...
- [note]最近公共祖先
最近公共祖先(LCA)https://www.luogu.org/problemnew/show/P3379 #define RG register #include<cstdio> #i ...
- python爬虫之request and BeautifulSoup
1.爬虫的本质是什么? 模仿浏览器的行为,爬取网页信息. 2.requests 1.get请求 无参数实例 import requests ret = requests.get('https://gi ...
- linux 中 用户管理 (composer 时不能root 遇到)
linux 是支持多用户的,可以同时多个用户在线操作,这点与 Windows 不同. 在我们项目组 操作linux 服务器时,可进行多用户管理,并赋予不同权限,下面是我学习并用的比较频繁的命令: 1. ...