郭锦松 發表於 2020-2-20 08:43:00

delphi:数据类型

<p>Object Pascal 语言提供了非常丰富的数据类型,即简单类型( Simple)、字符串类型( String)、结<br>构类型( Struct)、指针类型( Pointer)、函数和过程类型( Procedural)和变体类型( Variant)等.</p><p>( 1)简单类型( Simple)<br>简单类型包括实数类型( Real)和有序类型( Ordinal)。有序类型又包括整数类型、字符类型、布<br>尔类型、枚举类型和子界类型等。它们的关系如图 4-1 所示。<br>图 4-1 简单类型关系图<br>① 整数类型<br>整数类型包括的类型,如表 4-5 所示。<br>表 4-5 整数类型<br>整数类型 范围 备注<br>Integer -2 147 483 648~ 2 147 483 647 32 位带符号数<br>Cardinal 0~ 42 994 967 295 32 位无符号数<br>Shortint -128~ 127 8 位带符号数<br>Smallint -32 768~ 32 767 16 位带符号数<br>Longint -2 147 443 648~ 2 147 483 647 32 位带符号数<br>Int64 -2~ 2-1 64 位带符号数<br>Byte 0~ 255 8 位无符号数<br></p><p>Word 0~ 65 535 16 位无符号数</p><p>Longword 0~ 4 294 967 295 32 位无符号数</p><p>② 字符类型<br>字符类型有 3 种字符变量,如表 4-6 所示。<br>表 4-6 字符类型</p><p>字符类型 <br>取值 <br>备注</p><p>AnsiChar <br>8 位 <br>根据扩展 ANSI 字符表排列</p><p>WideChar <br>16 位 <br>根据 Unicode 码排列,前 256 个 Unicode 字符同 ANSI 字符相同</p><p>Char <br>Delpi 中通用的字符类型,相当于 WideChar</p><p>注意:因为一个字符在长度上并不表示一个字节,如果程序中必须用到字符的字节数,最好<br>用 SizeOf()函数获取。<br>③ 布尔类型<br>布尔类型包括 4 种,分别为 Boolean、 ByteBool、 WordBool 和 LongBool。 Boolean 和 ByteBool 各<br>占用一个字节, WordBool 占用两个字节, LongBool 占用 4 个字节。<br>Boolean 的值只能是 0( False)或 1( True), ByteBool、 WordBool 和 LongBool 可以是有符号的整<br>数,为 0 值代表 False,非 0 值代表 True。<br>最常用的是 Boolean 类型,而 ByteBool、 WordBool 和 LongBool 类型是为了与其他语言和 Windows<br>环境兼容,因为 Windows 的 API 在返回一个布尔值时,其值可能是一个两字节的有符号整数。如果试<br>图把返回值赋给 Boolean 类型的数据,编译器认为类型不匹配,若是进行类型强制转换,可能使返回<br>值的有效数据被截断。<br>④ 枚举类型<br>枚举类型是由一组有序的标识符组成的,它列出了所有这种类型可以包括的值。例如一个星期有<br>7 天,程序中分别用 0、 1、 2、 3、 4、 5、 6 来表示一个星期的每一天,但在程序中很不直观。下面就<br>是声明了一个枚举类型的代码:<br>type<br>DayOfWeek=(Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday);//变量名=(枚举列表)<br>其中列表中的标识符彼此之间用逗号分隔,它列出了枚举类型所能取值的范围。 Object Pascal 规<br>定,第 1 个标识符的值为 0,第 2 个标识符的值为 1,依次类推。<br>为了引用此枚举类型,必须声明一个 DayOfWeek 类型的变量,例如:<br>var<br>Days:DayOfWeek;<br>这样就声明了一个 DayOfWeek 类型的枚举变量 Days, Days 的值总是标识符列表中的一个。<br>为了简化程序,还可以将类型声明和变量声明合二为一,例如:<br>var<br>Days:(Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday);<br>注意:枚举的元素只能是标识符,标识符的命名规则必须符合 Object Pascal 关于标识符的规<br>定。例如不能以数字打头,标识符不能是保留字,同一个枚举元素不能同时出现在多<br>个枚举中。<br>Delphi 7 程序设计与开发技术大全<br>· 58·<br>⑤ 子界类型<br>子界类型是下列类型中某范围内的值,即整型、布尔型、字符型或枚举型。如果需要限制一个变<br>量的取值范围时,子界类型是一个好的选择。例如:<br>type<br>Month=1..12;<br>Letters=’A’.. ’H’;</p><p>DayOfWeek=(Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday); <br>//枚举型</p><p>Days=Monday..Friday; <br>//一个 DayOfWeek 型的子界</p><p>跟枚举类型一样,子界类型是不能直接参加运算的,必须声明一个子界类型的变量。<br>注意:声明和使用子界类型时,上界常数和下界常数的类型必须一致,且都是有序类型。子<br>界型变量所有参加的运算可参照它的宿主类型。子界型变量的取值是有范围的,如果<br>运算过程中超出这个范围将导致程序出错。<br>Delphi 的文档中提到,子界类型的上界和下界可以是表达式。<br>⑥ 实型<br>实型不是有序类型,因为它的值域是无限的,实型的数据也叫实数,实型用于表示通常所说的浮<br>点数。 Object Pascal 语言中的实数数据( Real)类型如表 4-7 所示。<br>表 4-7 实数类型<br>实数类型 范围 有效位数 字节数<br>Real48 2.9*10~ 1.7*1011~ 12 6<br>Single 1.5*10~ 3.4*107~ 8 4<br>Double 5.0*10~ 1.7*1015~ 16 8<br>Extended 3.6*10~ 1.1*1019~ 20 10<br>Comp -2+1~ 2-1 19~ 20 8<br>Currency -922337203685477.5808~ 922337203685477.5807 19~ 20 8<br>Real 5.0*10~ 1.7*1015~ 16 8<br>其中常用的实数类型是 Real、 Single、 Double。<br>( 2)字符串类型( String)<br>Object Pascal 的字符串类型分为短字符串和长字符串两种。<br>短字符串,指字符串长度最大不超过 255 个字符的字符序列。当编译开关的状态为{$H-}时,用<br>保留字 String 声明的是一个短字符串,不管编译开关$H 处于什么状态下,用 ShortString 声明的变量<br>总是短字符串类型。代码如下:<br>var<br>MyStr1:ShortString;<br>MyStr2:String;<br>保留字 String 后用方括号括起来的无符号整数,表示字符串的最大长度是 200。当把一个字符串<br>赋给一个短字符类型的变量时,超过其最大长度的将被截掉。<br>短字符串中的每一个字符都可以通过字符串名加字符索引来访问。索引是从 0 开始的,但索引 0<br>处存放的是字符串的实际长度,如下两行代码的功能是一样的,索引 1 处才是真正的字符开始处。<br>Ord(Str); //Str 代表短字符串<br>Length(Str);<br>短字符串的长度是动态改变的,可以使用 Low 和 High 函数取得字符串的最小序号和最大序号,<br>Low 的返回值是 0, High 的返回值是所声明的字符串的最大长度。<br>长字符串的长度几乎是无限制的,理论上可以达到 2GB,实际上只会受计算机内存的限制。要声<br>第 4 章 Object Pascal 语言<br>· 59·<br>明一个长字符串,可以用预定义的标识符 AnsiString 或把编译开关$H 改为{$H+}后用保留字 String 声<br>明。<br>长字符串在声明以后自动被初始化为空字符串。长字符串中的每个字符,是从索引 1 开始的,长<br>字符串没有索引 0,要取得长字符串的实际长度,只能调用 Length()函数。<br>长字符串在它最后一个字符后自动加一个 NULL 字符表示字符串结束( NULL 字符并不是长字符<br>串的一部分),这一点与字符指针类型( PChar)类似,因此将一个长字符串转换为 PChar 类型很方便,<br>语法为: PChar(Str),其中 Str 代表长字符串。长字符串被转换为一个指针,指向字符串的每一个字符,<br>即使长字符串是空的,强制转换后总是能够获得一个指向以 NULL 字符结束的字符中的指针。<br>Object Pascal 允许字符串和长字符串同时出现在一个表达式中,编译器会自动根据需要进行转换。<br>注意:字符串变量必须用一对单引号括起来,如果字符串本身就有单引号,这个单引号要用<br>两个连续的单引号表示,如: ’His name is ’’Jim’’’。<br>( 3)结构类型( Struct)<br>结构数据类型包括:集合类型、数组类型、记录类型、文件类型、类类型、类引用类型和接口类<br>型等。<br>① 集合类型<br>集合类型是一群具有相同类型的元素的组合,这些类型必须是有限类型,如整型、布尔型、字符<br>型、枚举型和子界类型。<br>集合类型的声明方法,请看以下代码:<br>type</p><p>Set1=set of ’A’.. ’Z’; <br>Set2=set of Char; <br>//基类型是子界型<br>//基类型是字符型</p><p>Set3=set(Jan,Feb,Mar,Apr); //基类型是枚举型<br>Object Pascal 语言提供了几个用于集合的运算符,用这些运行符可以判断集合与集合之间的关系,<br>例如对集合增删元素,求交集运算等。<br>赋值运算与简单类型一样,声明了一个集合类型的变量后,要为这个变量设定一个明确的值,例<br>如:<br>var<br>TInt1,Tint2:set of 1..10;<br>以上代码虽然声明了两个集合变量,但变量 TInt1 和 TInt2 并不是代表 1~ 10 组成的集合,必须对<br>它们赋值:<br>TInt1:=;<br>TInt2:=;<br>这样 TInt1 就是由 1、 3、 5、 7、 9 组成的集合, TInt2 就是由 2、 3、 4、 5、 8、 9、 10 组成的集合。<br>关系运算,就是对集合类型的运算,遵循数学中关于集合运算的规则,运算的结果是布尔值。集<br>合的关系运算就是判断两个集合相互之间的关系,关系运算符包括: =(等于)、 &lt;&gt;(不等于)、 &gt;=(大<br>于等于)、 &lt;=(小于等于)。<br>集合 A 等于集合 B,是指两个集合中的元素完全一样(不管元素的排列顺序如何),否则就是不<br>相等,如下:<br>=<br>&lt;&gt;<br>如果集合 B 中的元素在集合 A 中都可以找到,那么称集合 A 大于等于集合 B,反之称集合 B 大<br>于等于集合 A,如下:<br>&gt;=<br>Delphi 7 程序设计与开发技术大全<br>· 60·</p><p>注意: Object Pascal 中不能用&gt;或&lt;对集合类型进行关系运算。因为集合类型不是有序类型,<br>所以不能用 Ord、 Pred、 Succ 等函数。</p><p>② 数组类型<br>数组类型是某种数据类型的有序组合,其中每一个元素的值由其相对位置来指定,可以在数组的<br>某个位置上放置数据,并在需要时使用这些数据。下面代码声明了一个 Integer 型的数组变量:<br>var<br>TInt:array of Integer;<br>表示 TInt 指向一个含有 15 个 Integer 型元素的数据串列,代表每一个元素的是 1~ 15 之间的数字,<br>称为索引。数组的每一项由数据组名加“ [ ]”中的索引来表示。 TInt 包含 15 个变量, TInt代表第 1<br>个变量, TInt代表第 2 个变量,依次类推。<br>数组也可以用类型定义,代码如下:<br>type<br>Int=array of Integer;<br>var<br>TInt:Int;<br>可以用下面的方法对数组进行赋值:<br>for I=0 to 15 do<br>TInt:=0; //为数组各元素赋初值为 0<br>数组可以有多维的,定义及赋值方法如下:<br>type<br>TArr=array of Integer;<br>var<br>Arr:TArr;<br>C,R:Integer;<br>…… <br>for C:=1 to 15 do <br>for R:=1 to 15 do <br>Arr:=0; //为多维数组各元素赋初值为 0 <br>…… <br>③ 记录类型<br>记录是程序可以成组访问的一群数据的集合。例如下列代码,说明了一个记录类型的定义方法:<br>type <br>TStudent=record <br>ID:Integer; <br>Name:String; <br>Age:Integer; <br>Memo:String; <br>end; <br>记录包含可以保存数据的域,每一个域都有一个数据类型。上面代码中声明的 TStuednt 类型有 4<br>个域。用下面的方法对记录类型的变量进行声明与使用:<br>var <br>Stu:TStudent; <br>…… <br>with Stu do //以下代码为记录赋值,也可以只给记录的单个域赋值<br>第 4 章 Object Pascal 语言<br>· 61·<br>begin<br>ID:=1;<br>Name:= ’Jim’;<br>Age:=18;<br>Memo:= ’He is a good student.’;<br>end;<br>…… <br>( 4)指针类型(Pointer)<br>指针是一个表示内存地址的变量。指针类型在任何语言中都比较难理解,也是一种比较灵活的数<br>据类型。用以下形式定义指针变量:<br>type <br>指针类型标识符=^基类型;<br>下面列举一个对指针操作的例子,代码如下:<br>program Point; //指针示例工程<br>{$Apptype console} <br>type <br>PInt=^Integer; //定义指针类型<br>var <br>I,K:Integer; <br>PI:Pint; //整形指针<br>P:Pointer; //无类型指针<br>begin <br>I:=3; <br>K:=5; <br>PI:=@K; //整形指针指向整形数据<br>writeln(’K=’,PI^); <br>P:=@I; <br>K:=Integer(P^); //无类型指针指向整形数据<br>writeln(’K=’,K); <br>PI:=P; //指针之间赋值<br>writeln(’PI^:’,PI^); <br>readln; <br>end. <br>运行结束,如图 4-2 所示。<br>图 4-2 指针示例工程显示结果<br>提示:实例请参见本书配套光盘“ Section4\Pointer\Point.dpr”文件。<br>Delphi 7 程序设计与开发技术大全<br>· 62·<br>“ @”运算符放在变量前面,获取的是变量的地址,并可以将地址赋值为相同数据类型的指针。<br>把“ ^”运算符放在数据类型的前面,可以定义该类型的一个指针类型;放在一个指针的后面,可以获<br>得该指针所指地址空间的内容。<br>例如在“ Point”中,定义了一个可以指向任何数据类型的无类型指针 P,但使用过程中要注意类<br>型的转换,不可以直接将所指地址中的内容直接赋值给其他类型变量。<br>Object Pascal 语言中定义了一些标准指针,可以直接调用,如表 4-8 所示。<br>表 4-8 Object Pascal 语言中的标准指针</p><p>指针类型 <br>所指向变量的类型</p><p>PString, PAnsiString <br>AnsiString</p><p>PByteArray <br>ByteArray</p><p>PCurrency <br>Currency</p><p>PExtended <br>Extended</p><p>POleVariant <br>OleVariant</p><p>PShortString <br>ShortString</p><p>PVariant <br>Variant</p><p>PVarRec <br>TVarRec(调用时需引用 System 单元)</p><p>RTextBuf <br>TextBuf(调用时需引用 SysUtils 单元)</p><p>PWideString <br>WideString</p><p>PWordArray <br>TWordArray(调用时需引用 SysUtils 单元)</p><p>( 5)函数和过程类型( Procedural)<br>Delphi 是面向对象和事件驱动的,因此以前那种自上而下的结构化设计方法已经不适合在 Delphi<br>中编程了。函数和过程是 Pascal 语言的两种子程序,它们可以随时被调用。函数执行时有返回值,而<br>过程执行时,是没有返回值的。函数的调用是为了得到一个返回值,调用过程仅仅为了执行某种操作。<br>函数只能出现在表达式中,不能单独使用;过程不能出现在表达式中,仅能以某个语句的形式出现。<br>① 函数的使用<br>函数在调用之前必须先声明。函数声明的语法格式如下:<br>function 函数名(&lt;形式参数表&gt;):&lt;类型&gt;;<br>begin<br>&lt;语句&gt;;<br>&lt;语句&gt;;<br>...<br>&lt;语句&gt;;<br>end;<br>函数调用的语法格式为:<br>&lt;函数名&gt;(&lt;实参表&gt;);<br>注意:实参表中的各个参数必须用逗号分割,其顺序必须和函数说明的顺序相对应,并且个<br>数相同、类型相符。<br>下面举一个函数调用的简单例子,在程序中编写一个名为 Total 的自定义函数,主要功能是对传<br>过来的两个参数进行相加计算,返回计算完毕后的结果。主要代码如下:<br>program FunctionDemo;<br>{$APPTYPE CONSOLE}<br>uses<br>SysUtils;<br>第 4 章 Object Pascal 语言<br>· 63·<br>//定义函数,用于计算 a、 b 参数的和<br>function Total(a,b:Integer):Integer;<br>begin<br>Total:=a+b;<br>end;<br>var<br>a,b,c:Integer;<br>begin<br>try<br>Writeln(’请输入 a 值’);<br>Readln(a);<br>Writeln(’请输入 b 值’);<br>Readln(b);<br>c:=Total(a,b); //调用函数<br>Write(’a 与 b 的和为: ’);<br>Writeln(c);<br>Readln;<br>except<br>Writeln(’输入的内容不是数字’);<br>end;<br>end.<br>提示:实例请参见本书配套光盘“ Section4\Function\FunctionDemo.dpr”文件。<br>② 过程的使用<br>过程与函数类似,在调用之前必须进行声明。过程声明的语法格式如下:<br>proceduce &lt;过程名&gt;(&lt;形式参数表&gt;)<br>begin<br>&lt;语句&gt;<br>&lt;语句&gt;<br>...<br>&lt;语句&gt;<br>end;<br>过程调用的语法格式为:<br>&lt;过程名&gt;(&lt;实参表&gt;)<br>( 6)变体类型( Variant)<br>变体类型能够在运行期间动态地改变类型。变体类型能支持所有简单的数据类型,如整型、浮点<br>型、字符串、布尔型、日期时间、货币及 OLE 自动化对象等。<br>注意:变体类型不能表达 Object Pascal 对象。</p>

</div>
<div id="MySignature" role="contentinfo">
    <p>本文来自博客园,作者:huiy_小溪,转载请注明原文链接:https://www.cnblogs.com/huiy/p/12334285.html</p><br><br>
来源:https://www.cnblogs.com/huiy/p/12334285.html
頁: [1]
查看完整版本: delphi:数据类型