这是一个实例:

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]的时候却报错,原因就是这个二维数组不是矩阵形式,除了第三列,其他地方都是不存在的,尽管已经声明了。

http://blog.csdn.net/chaijunkun/article/details/5373597

关于Delphi中二维数组的声明和大小调整(对非基本类型数据,小心内存泄漏)的更多相关文章

  1. 关于Delphi中二维数组的声明和大小调整

    这是一个实例: procedure TMainForm.Button1Click(Sender: TObject);var  arr:array of array of string;begin  s ...

  2. JS中二维数组的声明

    var myarr=new Array(); //先声明一维 for(var i=0;i<2;i++){ //一维长度为2 myarr[i]=new Array(); //再声明二维 for(v ...

  3. 关于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 ...

  4. 关于offsetWidth,offsetHeight,offsetTop,offsetLeft和二维数组的声明

    offsetWidth,offsetHeight,offsetTop,offsetLeft 为只读状态,返回的值是int形式 只读形式即不能通过修改其值的大小. 想要修改某元素的这些值的大小(widt ...

  5. C++中二维数组的动态分配

    C++中二维数组的动态分配 作者:   来源:csdn博客   公布者:admin 时间:2009-04-23 13:55:03   点击:115 C++中一维数组的动态分配十分经常使用,但C++刚開 ...

  6. C++二维数组讲解、二维数组的声明和初始化

    我们知道,一维空间是一条线,数学中用一条数轴来表达:二维空间是一个平面,数学中用平面坐标系来表达.那么二维数组又是什么样的呢? 线与面 我们用一个下标来描述一维数组中的某个元素,就好像在用数描述一条线 ...

  7. [语法]C语言中二维数组做输入参数

    C语言中二维数组做输入参数时, 可以同时指定各维长度, 可以只指定第二维的长度, 不可以只指定第一维的长度, 不可以各维长度都不指定. 一句话总结:要指定至少指定第二维,都不指定是不行的. 具体栗子如 ...

  8. IT兄弟连 Java语法教程 数组 多维数组 二维数组的声明

    Java语言里提供了支持多维数组的语法.但是这里还想说,从数组底层的运行机制上来看是没有多维数组的. Java语言里的数组类型是引用类型,因此数组变量其实是一个引用,这个引用指向真实的数组内存,数组元 ...

  9. C语言中二维数组如何申请动态分配内存

    C语言中二维数组如何申请动态分配内存: 使用malloc函数,先分配第一维的大小,然后再循环分配每一维的大小 #include <stdio.h> #include <malloc. ...

随机推荐

  1. css position 属性 (absolute 和fixed 区别)

    在css3中,position的属性值有:inherit, static, relative ,absolute, fixed. inherit 是继承父元素的position属性值,IE不支持. s ...

  2. 【转】iOS隐藏导航条1px的底部横线

    默认情况下会有这条线 第一种方法: 1 2 3 4 5 6 UINavigationBar *navigationBar = self.navigationController.navigationB ...

  3. T4模板之菜菜鸟篇

    一.废话 T4(Text Template Transformation Toolkit)是微软官方在VisualStudio 2008中开始使用的代码生成引擎.在 Visual Studio 中,“ ...

  4. Clamp函数

    Clamp函数可以将随机变化的数值限制在一个给定的区间[min, max]内: template<class T> T Clamp(T x, T min, T max) { if (x & ...

  5. PHP系列笔记——Zend_Controller工作流程

    Zend_Controller_Front接收请求,然后调用Zend_Controller_Router_Rewrite来决定哪个控制器被派遣.为了在请求中设置控制器和动作名称,Zend_Contro ...

  6. leetcode 31. Next Permutation(字典序的下一个)

    描述: Implement next permutation, which rearranges numbers into the lexicographically next greater per ...

  7. Effective MySQL之备份与恢复

    五分钟成为一名DBA 如果我们已经有了一个MySQL生产级系统,而该产品却没有MySQL备份策略,那么我们至少应该做些什么呢?在采取任何备份策略之前,有许多有关数据库大小和存储策略引擎的用法的预备知识 ...

  8. Android Log工具类

    import java.text.SimpleDateFormat; import java.util.Date; import android.util.Log; public class LogU ...

  9. 使用SWFUpload插件上传文件

    演示代码由两部分组成,包括前台文件和后台文件: 1.前台文件index.html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transi ...

  10. IOS 物理引擎

    来自IOS7 by tutorials   下面是个人的一点翻译总结 1,首先在初始化方法李画一个方块 UIView* square = [[UIView alloc] initWithFrame: ...