delphi数据类型

来源:互联网 发布:adobe voco mac 编辑:程序博客网 时间:2024/04/28 17:25

一、数据类型:
(1) 基本数据类型:
a、 整数类型: (通用类型<32位>:Integer-有符号;Cardinal-无符号)
具体:
有符号:Shortint<8位>,Smallint<16位>,Longint<32位 >
无符号:Byte<8位>,Word<16位>,LongiWord<32位 >

b、字符类型: (通用类型<8位>:Char -与AnsiChar等同)
具体:
AnsiChar<8位> :主要存放Ansi字符
WideChar<16位>:主要存放Unicode字符

c、布尔类型: (通用类型<8位>:Boolean-与ByteBool等同)
具体:
ByteBool<8位>,WordBool<16位>,LongBool<32位>
不同的布尔类型主要用于鱼其它编程语言及不同windows系统兼容。

d、枚举类型:
定义:type 枚举类型标识符=(key1[=val1],.。。。,keyn[=valn]) :n<=255
如果给某些key指定了值,则未指定值的key是前一个key值加1;
如果全部默认不指定值,则key1值为0,往后逐个加1。
e、子界类型:
定义:type 子界类型标识符=下界 ..下界
如:type SubInt=1..3 0;表示 1~30的整数
type SubChar=''''a''''..''''z'''';表示字符
※注:1、以上四种类型称为有序类型,即除第一个数为都有先行数、除最后一个数外都有后继数。在这里
(计算机里),整数是有限的。有序类型的数都有一个序号,称为序数。整数的序数为其本身,其他类型第一
个数序数为0,依次递增。
2、子界类型上、下界必须是有同一有序类型,且上界序数大于下界序数。

f、浮点类型: (通用类型<8字节>:Real-与Double等同)
具体:
Double<8字节>,Real48<6字节>Single<4字节>,
Extended<10字节>,Comp<8字节>,Currency<8字节>
g、字符串类型: (通用类型:String-与AnsiString等同)
具体:
ShortString :最多存放255个字符,第一个自己存放字符个数,不以NULL结尾
AnsiString :存放Ansi字符,以NULL结尾
WideString:存放Unicode字符,以NULL结尾

h、时间、日期类型:TDateTime -实际是浮点类型的别称
(2)复杂数据类型:
a、指针类型:
定义:type 指针类型标识符=^基本类型;
内在分配:New() 内存释放:Destroy()
对于Pointer 和PChar 用GetMem()或AllocMem()分配内存,用FreeMem()释放内存
分配内存后,就可以当成基本类型一样使用:指针类型标识符^
实际上常如下运用指针:
var 变量标识符:^基本类型;
为变量分配内存后就可以将(变量标识符^)当成普通变量使用。
b、记录类型:
定义:type 记录类型标识符=Record
字段1:类型;
...
字段n:类型;
end;
c、集合类型:
定义: type 集合类型标识符=Set of 基本类型的子集或子界类型;(<=255个元素)
d、变体(通用)类型: Variant;
Delphi 2.0引进了一个功能强大的数据类型,称为变体类型(Variant),主要是为了支持Ole自动化
操作。实际上, Delphi的Variant封装了OLE使用的Variant,但Delphi 的Variant在Delphi 程序的其他领域
也很有用。正如不久就要学到的, Object Pascal是唯一能在运行期间和编译期间识别Variant的语言。
Delphi 3引进了一个新的被称为OLeVariant类型,它跟Variant基本一致,但是它只能表达与OLE 自
动化操作相兼容的数据类型。本节介绍Variant,然后介绍OLEVariant,并对两者进行比较。
1. Variant能动态改变类型
有时候变量的类型在编译期间是不确定的,而Variant能够在运行期间动态地改变类型,这就是引
入Variant 类型目的。例如,下面的代码在编译期间和运行期间都是正确的:
var
V: Variant;
begin
V:='Delphi is Great!'; //Variant 此时是一个字符串
V: = 1 ; / / Variant 此时是一个整数
V: = 123.34 ; / / Variant 此时是一个浮点数
V: = True ; / / Variant 此时是一个布尔值
V:=CreateOleObject('word.Basic'); //Variant此时是一个OLE 对象
end ;
Variant能支持所有简单的数据类型,例如整型、浮点型、字符串、布尔型、日期和时间、货币以
及OLE自动化对象等。注意Variant不能表达Object Pascal对象。Variant可以表达不均匀的数组(数组的
长度是可变的,它的数据元素能表达前面介绍过的任何一种类型,也可包括另一个Variant数组)。
(3)数组类型:
a、一维数组:
定义:type 数组标识符=Array[下标下限..下标上限] of 基本类型;
b、多位数组:
定义: type 数组标识符=Array[下限1..上限1,...,下限n..上限n] of 基本类型;
c、动态数组(变量):
var 标识符:array of 基本类型;
SetLength(标识符,个数);//分配空间
标识符:=nil;//释放
DELPHI基础数组类型
数组类型
数组是相同类型的元素按一定顺序组成的序列.数组中的每一个数据元素都可以通过数组变量名和一个惟一的索引号来存取,它们被顺序地安排在内存中的一段连续的存储区域.
数组可以分为一维数组和多维数组,从DELPHI5开始又引入了动态数组,因此,在DELPHI语言中,数据又可分为表态数组和动态数组两种类型.
&#8226;数据类型的声明,数组也是高级数据类型,因此,在使用数组类型之前,应当首先使用保留字ARRAY进行类型声明.下面,我们以一维和二维,表态和动态数组为例,说明数组类型的声明格式.
一维静态数组的声明
type
数组标识符=array[下标类型] of 基类型:
二维静态数组的声明
type
数组标识符=array[下标类型] of array[下标类型] of 基类型;
一维动态数组的声明
type
数组标识符=array of 基类型;
二维动态数组的声明;
type
数组标识符=array of array of 基类型;
在上述声明语句中,下标类型必须是以子界形式给出的有序类型,基类型可以是除文件类型之外的任意数据类型.例如:
type
myarray1=array [1..10] of integer;
//一维静态数组,可以容纳10个整形数据
myarray2=array [1..10,’a’..’z’] of integer;
//二维表态数组,可以容纳20个字符串数据
myarray3=array of real;
//一维动态数组,可以容纳实型整数
myarray4=array of array of real;
//二维动态数组,可以容纳实型数据
数组变量及其使用,在声明了数组类型之后,就可以在程序中定义变量并在程序中使用,数组变量的定义仍然是使用保留字VAR,但对于表态数组变量和动态数组变量来说,它们的存储分配是不同的,静态数组在声明时通过下标给定了存储基类型数据的容量,因而,其变量所需的存储可以通过静态分配完成.而动态数据在声明时,没有使用下标指定存储基类型数据的容量,所以,其变量所需的存储只能通过标准例程SETLENGTH来动态进行分配.
数组变量在声明之后,对数组元素的访问是通过数组变量标识符和方括号界定的’’ 下标值”来进行的,对于静态数组变量,其下标值范围已经在类型声明时给出,而对于动态数组变量来说,动态分配存储之后,其下标值范围为0到容量-1.如果要释放一个不再用到的动态数组,可以将NIL赋值给该动态数组变量.
下面新建一个控制台应用程序,在代码编辑器中编写下列程序:
type
myarray1=array[1..10] of integer;
myarray2=array[2..11,'a'..'c'] of string;
myarray3=array of real;
myarray4=array of array of real;
var
a1:myarray1;
a2:myarray2;
a3:myarray3;
a4:myarray4;
begin
writeln('sizeof(a1):',sizeof(a1));//10
writeln('sizeof(a2):',sizeof(a2));//120
writeln('sizeof(a3):',sizeof(a3));//4
writeln('sizeof(a4):',sizeof(a4));//4
(*通过下标写静态数组变量*)
a1[2]:=200;
a2[2,'a']:='string';
(*通过下标写动态数组变量*)
setlength(a3,1); //为A3赋值8个字节存储
a3[0]:=2000.05;
setlength(a4,2,2); //为A4分配另外32字节存储
a4[1,1]:=-19.32;
(*读数组变量*)
writeln('a1[2]的值:',a1[2]); //200
writeln('a2[2,''a'']的值',a2[2,'a']);//string
writeln('a3[0]的值:',a3[0]:10:3); //2000.050
writeln('a4[1,1]的值:',a4[1,1]:10:3); //-19.320
(*各个数组变的长度和下标值范围*)
writeln('a1的长度:',length(a1));//10
write('a1的最小下标值:',low(a1),' ');
writeln('a1的最大下标值:',high(a1));
writeln('a2的第一维的长度:',length(a2));//10
write('a2第一维的最小下标值:',low(a2),' '); //2
writeln('a2第一维的最大下标值:',high(a2)); //11
writeln('a2第二维的长度:',length(a2[2])); //3
write('a2第二维的最小下标值:',low(a2[2]),' '); //a
writeln('a2的第二维最大下标值:', high(a2[2])); //c
writeln('a3的长度:',length(a3)); //1
write('a3的最小下标值:',low(a3),' ');//0
writeln('a3的最大下标值:',high(a3)); //0即1-1
writeln('a4的第一维长度:',length(a4));//2
write('a4第一维最小下标值:',low(a4),' ');//0
writeln('a4第一维最大下标值:',high(a4));//1
writeln('a4的第二维长度:',length(a4[0])); //2
write('a4第二维最小下标值:',low(a4[0]),' ');//0
writeln('a4第二维最大下标值:',high(a4[0]));//1
setlength(a3,0);
writeln('a3的长度:',length(a3));//0
write('a3的最小下标值:',low(a3),' ');//0
writeln('a3的最大下标值:',high(a3));//-1
readln;
end.

&#8226;说明,通过前四前语句的输出,我们可以看到静态数组变量和动态数组变量的存储分配情况.a1可以保存10个integer类型整型数据的静态数组,而每个integer需要4个字节的存储,因此编译器为其分配了40个字节的存储.a2为二维静态数组,可以保存10×3即30个STRING类型字符串数据的静态数组,而每个string需要4个字节存储实际字符串存储的引用,因此编译器为其分配120个字节的存储,但对于a3和a4来说,编译器仅为其分配4个字节存储,以保存对动态分配空间的引用值.
在程序的后半部分,用了若干条语句反映了各个数组每一维的长度及其最小,最大下标值,数组的长度可以由标准函数例程length得到,最小,最大下标值则可以分别由标准函数例程low和high得到,需要指出的是,在尚未通过setlength为其分配存储或者使用setlength(动态数组变量标识符,0)为其分配存储,使得某动态数组变量的长度为0时,由low返回的最小下标值为0,最大下标值为-1.
对于数组变量来说,我们可以先声明数组类型,再根据类型来定义变量,如上例所示,也可以采用简化的办法,直接通过变量定义来完成.如:
var
a1:array[1..10] of integer;
a2:array[1..10,’a’..’z’] of string;
a3:array of real;
a4:array of array of real;
尽管如此,但对于高级数据类型,先声明类型后定义变量的概念是不能混淆的.
另外,在上面的范例中,我们使用setlength(a4,2,2)语句创建了一个”矩形”的动态数组,即a4第一维的长度2,第二维的长度2,实际上,对于多维动态数组来说,其各维的长度可以是不同的,在下面的范围中,我们就建立一个三角形的动态数组.
编写控制台应用程序,建立各维长度不同的动态数组.在代码编辑器中写下程序;

var
a:array of array of string;
i,j:integer;
begin
setlength(a,10); //第一维的长度为10
for i:=low(a) to high(a) do begin
setlength(a,i); //第二维的长度随第一维的长度变化而变化
for j:=low(a) to high(a) do begin
a[i,j]:=inttostr(i)+'/'+inttostr(j)+' ';
write(a[i,j]);
end;
writeln;
end;
readln;

end.

原创粉丝点击