您的位置:首页 > 编程语言 > Delphi

Delphi学习笔记 数据类型

2014-05-18 22:42 295 查看
数据类型:


Delphi的数据类型主要有以下这几类:简单数据类型(Simple),字符串数据类型(String),结构数据类型(Struct),指针数据类型(pointer),函数和过程数据类型(procedural),变体数据类型(variant)等

1.1 有序数据类型

有序数据类型包括整数类型,字符类型,布尔类型,枚举类型和子界类型。对于学过其它语言的朋友来说,前四个并不会陌生,只是在类型的表达形式上会有不同。这里需要注意的是,对于字符类型来说一个字符在长度上并不表示一个字节,所以要返回字符串长度需要用函数(Sizeof);布尔类型除了我们熟知的Boolean外,还有ByteBool,WordBool、LongBool。它们之间的主要区别在于字节长度。
子界类型是整型、布尔型、字符型或枚举型中某范围的值。例如

type
Thours=0..23;
TValidLetter='A'..'F';
TWorkDay=Monday..Friday;


1.2实数数据类型(即浮点数)

这里我只介绍开发中常用的实数类型:Double、Currency

二、字符串类型

ShortString是为兼容老版本而存在的,string为动态字符串数组,string[]为静态字符串数组例如

var Str:string;

var S:string[64]; //创建的是一个ShortString字符串类型.

使用+字符串来连接字符串(比C++的sprintf , strcat好用),也可以使用Concat()方法.

这里补充一下字符串常识(转载自万一博客):

'BORLAND'   { BORLAND }
'You''ll see'   { You'll see }
''''        { ' }
''      { 空串 }
' '         { 空格 }
#89#111#117 { You }
#89'Y'#89   { YYY }
#89 + 'Y' + #89 { YYY }
#13#10      { 换行 }
只有字符串指针才能进行运算。例如:

{字符串指针运算}
procedure TForm1.Button6Click(Sender: TObject);
var
p: PChar;
begin
p:= 'China';
Inc(p);  //p:=p+1;相当于对于指针地址的运算
ShowMessage(p);  //hina
Dec(p);  //p:=p-1;
ShowMessage(p);
end;
字符串函数(StrCopy、StrCat、StrPas):

{StrCopy:复制字符串(不进行长度检查);
StrCat:在原字符串的末尾拼接字符串(不进行长度检查),类似于+;
StrPas:将Pchar转换成string}
procedure TForm1.Button14Click(Sender: TObject);
const
p1: PChar = 'CodeGear';
p2: PChar = 'Delphi';
var
S: array[0..15] of Char;
begin
StrCopy(S,p1);
//StrCat(S,' ');
StrCat(S,p2);
ShowMessage(S);
ShowMessage(StrPas(S));
end;


三、结构类型

简单数据类型包括集合类型、数组类型、记录类型、文件类型、类类型、类引用类型、接口类型。

3.1 集合类型(set)

集合类型是一群相同类型元素的组合,必须是有限类型如整型、布尔型、字符型、枚举型和子界型。在编写代码时,需要注意在Delphhi7 中无法使用for ... in ... 的语法(JAVA与python中常用于遍历)。例如

type
TInt=0..255; //BaseType为有序类型
T1 = set of TInt;  //定义集合类型
下面来介绍一下集合类型的几个运算符:

3.1.1 关系运算

用in来判断一个给定的元素是否在一个集合中
//集合T1中是否有200:
if 200 in T1 then
//TDate中是否没有Mon:
if not (Mon in TDate) then


3.1.2 增删元素

用Include()和Exclude()过程来对一个集合变量增删元素(推荐使用):
Include(T1,256); //在集合中增加256
Exclude(T1,'a'); //在集合中删除'a'
3.1.3 交集

用*来计算两个集合的交集,即交集的结果为两个集合所共有的元素。

3.2数组类型(array)

对于学过其它编程语言的人来说,数组是我们再熟悉不过的类型。在Delphi中的声明如下

var
TDou: array [1..25] of Double;
也可以做如下声明:

[delphi] view plaincopy
type
Dou = array[1..25] of Double;
var
TDou : Dou;


数组赋值:

[delphi] view plaincopy
for i:=1 to 25 do
TDou[i] := 0;


3.3记录数据成员(record)(这个常见与数据库中) 这就是结构体..

记录是可以成组访问的一群数据的集合. 记录可以包含保存数据的域,每个域有一个数据类型,记录类型中各数据的数据类型长度满足字节对齐条件,即记录类型中所有数据的数据类型都匹配记录类型中所有数据最长的数据类型的长度.而在压缩记录类型packet record中不存在这一条件(听起来有点像C++中的结构体):例如:

type       TEmployee = record;       Name: string[20];       YearHired:1999..2000;       Salary: Double;       Position: string[20];  end;
声明记录型的变量

var
NewEmployee,PromotedEmployee: TEmployee;
访问记录的单域:

NewEmployee.Salary := 1000;
给整个记录赋值,使用with .. do..:

with PromotedEmployee do
begin
Name := 'Wang Hong';
YearHired := 1993;
Salary :=2000;
Position :='editor';
end;
这里需要注意的是在delphi7中,对于记录类型的方法、属性和构造函数支持并不支持( 听起来这是类才有的属性)

四、指针类型(pointer)

指针类型的变量指向内存空间的地址。 在使用指针前,必须先用GetMem来分配内存,使用完后利用FreeMem函数释放,定义如下:
type
PointerName = ^typt;
这里简要写个使用指针类型的例子:

program Project1;

{$APPTYPE CONSOLE}

uses
SysUtils;
type
Pint = ^integer;  //定义指针类型

var
a,b:integer;
pt : Pint;  //整型指针
p : pointer;  //无类型指针
begin
{ TODO -oUser -cConsole Main : Insert code here }
a:= 2;
b:= 3;
pt:=@b;
writeln('b=',pt^);
p:=@a;  //整型指针指向整型数据
b:=integer(p^); //无类型指针指向的内容给整型变量赋值(须经过类型转换)
writeln('b=',b);
pt:=p;  //指针间赋值
writeln('pt^',pt^);
readln;
end.


这里需要说明的是

1、@运算符放在变量前面,将获取变量的地址,并可以把地址赋给同样数据类型的指针;(C++中的取地址&)

2: ^运算符放在一个数据类型前面,定义该类型的指针(C++中 , int * Point)

3:^运算符放在一个指针后面获取该指针指向的地址空间内容(C+=中使用 *Point, 指向)

4:不可以直接将所指地址中的内容直接赋值给其他类型变量,必须经过类型转换.(C++中也需要强制转换(int *) void)

五、变体类型(Variant)

变体类型能在运行期间动态地改变类型,支持所有简单的数据类型,但不能表达Object Pascel对象。
六、数据类型转换(转载自万一博客)

Chr //将一个有序数据转换为一个 ANSI 字符
Ord //将一个有序类型值转换为它的序号
Round   //转换一个实型值为四舍五入后的整型值
Trunc   //转换一个实型值为小数截断后的整型值
Int //返回浮点数的整数部分
IntToStr    //将数值转换为字符串
IntToHex    //将数值转换为十六进制数字符串
StrToInt    //将字符串转换为一个整型数,如字符串不是一个合法的整型将引发异常
StrToIntDef //将字符串转换为一个整数,如字符串不合法返回一个缺省值
Val     //将字符串转换为一个数字(传统 Turbo Pascal 例程用于向后兼容)
Str     //将数字转换为格式化字符串(传统 Turbo Pascal 例程用于向后兼容)
StrPas      //将零终止字符串转换为 Pascal 类型字符串,在 32 位 Delphi 中这种类型转换是自动进行的
StrPCopy    //拷贝一个 Pascal 类型字符串到一个零终止字符串, 在 32 位 Delphi 中这种类型转换是自动进行的
StrPLCopy   //拷贝 Pascal 类型字符串的一部分到一个零终止字符串
FloatToDecimal  //将一个浮点数转换为包含指数、数字及符号的十进制浮点记录类型
FloatToStr  //将浮点值转换为缺省格式的字符串
FloatToStrF //将浮点值转换为特定格式的字符串
FloatToText //使用特定格式,将一个浮点值拷贝到一个字符串缓冲区
FloatToTextFmt  //同上面例程,使用特定格式,将一个浮点值拷贝到一个字符串缓冲区
StrToFloat  //将一个 Pascal 字符串转换为浮点数
TextToFloat //将一个零终止字符串转换为浮点数


七、注释

注释代码。用“{ffff}”、“{*fff*}”、“//”来注释。
{}中包含$符号表示编译命令

{$ WARNINGS OFF}

告诉编译器不要产生警告消息
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: