关于Delphi中二维数组的声明和大小调整
这是一个实例:
procedure TMainForm.Button1Click(Sender: TObject);
var
arr:array of array of string;
begin
setlength(arr,2,3);
arr[1,2]:='this is a test';
setlength(arr,0,0);
setlength(arr,4,5);
showmessage(arr[1,2]);
end;
声明一个二维数组的方法是用 array of array of 类型 这很贴近人们的思维方式。同理可推出三维数组的声明方法为 array of array of array of 类型
对二维数组大小的调整仍然使用SetLength函数,第一个参数是数组名称,第二个参数是最靠近数组名称那个维度的大小,第三个参数是远离数组名称的维度的大小,以此类推。
在以上的例子中还有一个特别之处。就是声明了一个大一点范围的二维数组以后,如果对数组重新分配大小,并且这个新的大小是小于原来数组的,那么,大的二维数组与小的二维数组之间相差的部分将会被清除(补充一句,如果这个数组的类型不是基本类型,比方说是这样声明的Can:array of TCanvas 数组类型为TCanvas,那么在这种情况下不会自动调用析构函数,这样就容易造成内存泄漏,所以在编程的时候一定要注意这种使用方法)。即便是马上将数组大小调整回来甚至更大,都不能使这些数据回来。这个和Delphi中提供的TStringGrid控件不一样。对TStringGrid的行列数量进行调整后,原来的数据都不会丢失,除非使用TStringGrid.Rows.Clear;
另外,Delphi中还允许设置非矩阵型的动态数组。以下是一个例子
procedure TMainForm.Button1Click(Sender: TObject);
var
arr:array of array of string;
begin
setlength(arr,10);
setlength(arr[2],5);
arr[2,4]:='this is a test';
showmessage(arr[2,4]);
showmessage(arr[3,1]);
end;
这里面声明了一个二维字符串数组arr,首先对这个数组的第一维度(按照习惯,称之为“列”)进行设置,大小为10个。然后将这个数组的第三列(下标是2,但实际却是第三列)的行数进行单独设置,大小为5个。这样就构成了下图这样的矩阵
N N X N N N N N N N
N N X N N N N N N N
N N X N N N N N N N
N N X N N N N N N N
N N * N N N N N N N
(“X” 代表可用 “N”代表不可用 “*”代表arr[2,4]元素)
然后对arr[2,4]进行赋值“this is a test”。先要求显示arr[2,4]的值,OK,完全没有问题,但到了arr[3,1]的时候却报错,原因就是这个二维数组不是矩阵形式,除了第三列,其他地方都是不存在的,尽管已经声明了。
————————————————
版权声明:本文为CSDN博主「Jack_Chai」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/chaijunkun/article/details/5373597
关于Delphi中二维数组的声明和大小调整的更多相关文章
- 关于Delphi中二维数组的声明和大小调整(对非基本类型数据,小心内存泄漏)
这是一个实例: procedure TMainForm.Button1Click(Sender: TObject);var arr:array of array of string;begin s ...
- JS中二维数组的声明
var myarr=new Array(); //先声明一维 for(var i=0;i<2;i++){ //一维长度为2 myarr[i]=new Array(); //再声明二维 for(v ...
- 关于Delphi中二维数组赋初始值
dctb:array[1..2,1..38] of Single=((0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ...
- 关于offsetWidth,offsetHeight,offsetTop,offsetLeft和二维数组的声明
offsetWidth,offsetHeight,offsetTop,offsetLeft 为只读状态,返回的值是int形式 只读形式即不能通过修改其值的大小. 想要修改某元素的这些值的大小(widt ...
- C++中二维数组的动态分配
C++中二维数组的动态分配 作者: 来源:csdn博客 公布者:admin 时间:2009-04-23 13:55:03 点击:115 C++中一维数组的动态分配十分经常使用,但C++刚開 ...
- C++二维数组讲解、二维数组的声明和初始化
我们知道,一维空间是一条线,数学中用一条数轴来表达:二维空间是一个平面,数学中用平面坐标系来表达.那么二维数组又是什么样的呢? 线与面 我们用一个下标来描述一维数组中的某个元素,就好像在用数描述一条线 ...
- [语法]C语言中二维数组做输入参数
C语言中二维数组做输入参数时, 可以同时指定各维长度, 可以只指定第二维的长度, 不可以只指定第一维的长度, 不可以各维长度都不指定. 一句话总结:要指定至少指定第二维,都不指定是不行的. 具体栗子如 ...
- IT兄弟连 Java语法教程 数组 多维数组 二维数组的声明
Java语言里提供了支持多维数组的语法.但是这里还想说,从数组底层的运行机制上来看是没有多维数组的. Java语言里的数组类型是引用类型,因此数组变量其实是一个引用,这个引用指向真实的数组内存,数组元 ...
- C语言中二维数组如何申请动态分配内存
C语言中二维数组如何申请动态分配内存: 使用malloc函数,先分配第一维的大小,然后再循环分配每一维的大小 #include <stdio.h> #include <malloc. ...
随机推荐
- M - Ordering Tasks(拓扑排序)
M - Ordering Tasks Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Descri ...
- Spring Boot 笔记 (8) - H2 数据库
Maven 依赖 <dependency> <groupId>com.h2database</groupId> <artifactId>h2</a ...
- Centos7安装autoconf
一.原因 安装此插件的原因:在初始化MySQL数据库时出现提示FATAL ERROR: please install the following Perl modules before executi ...
- js基础知识3
系统对话框方法 警告框 window.alert('mcw'); 效果显示 确认框 var a = window.confirm('你确定要离开网站?'); console.log(a); 如果点击确 ...
- 用java刷剑指offer(二叉树中和为某一值的路径)
题目描述 输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径.(注意: 在返回值的list中,数组长度大 ...
- 如何使用MCUXpresso IDE创建一个Cortex-M工程
拿到Cortex-M开发板之后,就可以开始使用MCUXpresso IDE上手入门.在这个教程中,我们将详细介绍如何基于CMSIS(Cortex微控制器软件接口标准)在MCUXpresso IDE中为 ...
- Murach ASP.NET 4.5 C# With Visual Studio 2013 翻译
本书由我自己翻译完,省略书中练习部分,练习部分可以阅读原文 本书对新手友好,介绍了Web通讯的基本原理,ASP.NET开发,项目开发所需的各种开发与部署技术, Ajax,与WCF, Web API ...
- 实用mysql数据库命令
连接:mysql -h主机地址 -u用户名 -p用户密码 (注:u与root可以不用加空格,其它也一样)断开:exit (回车) 创建授权:grant select on 数据库.* to 用户名@登 ...
- 《hello-world》第九次团队作业:【Beta】Scrum meeting 2
项目 内容 这个作业属于哪个课程 2016级计算机科学与工程学院软件工程(西北师范大学) 这个作业的要求在哪里 实验十三 团队作业9:Beta冲刺与团队项目验收 团队名称 <hello--wor ...
- 神经网络(10)--有助于对神经网络Backpropagation算法的理解
为了更好的理解backpropagation,先来了解一下forward propagation的内部 我们在forward propagation中计算Z1(3)的方法与在back propagat ...