第9章Cx51构造数据类型 本章讨论几种复杂的数据类型一构造型数 据类型。它们是按照一定的规则由一系列 元素类型组成的数据类型。其中元素类型 又叫基类型,它给出构造型数据本身的类 型,既可以是简单的,也可以是复杂的 定的规则体现为构造方法,而构造方法 决定了如何访问一个元素 ●复杂数据类型主要有数组、结构、联合和 指针四种构造型数据类型
第9章 Cx51 构造数据类型 • 本章讨论几种复杂的数据类型—构造型数 据类型。它们是按照一定的规则由一系列 元素类型组成的数据类型。其中元素类型 又叫基类型,它给出构造型数据本身的类 型,既可以是简单的,也可以是复杂的。 一定的规则体现为构造方法,而构造方法 决定了如何访问一个元素。 • 复杂数据类型主要有数组、结构、联合和 指针四种构造型数据类型
9.1数组类型 数组类型一般由固定数量的同类元素所组成。其 特点是数量确定,元素类型要相同。在C语言中 数组的元素类型主要是整数类型和字符类型,数 组的维数主要是一维的,两维以上用得较少。 数组变量的说明通过说明语句来实现。 例如,数组变量P(以后简称“数组P”)是10个 整数的数组,通过如下说明语句来说名 ●intP[10] 其中,P为数组变量的名称,不是数组类型的名 称;int为数组的元素类型;10为数组元素的个数
9.1数组类型 • 数组类型一般由固定数量的同类元素所组成。其 特点是数量确定,元素类型要相同。在C语言中, 数组的元素类型主要是整数类型和字符类型,数 组的维数主要是一维的,两维以上用得较少。 • 数组变量的说明通过说明语句来实现。 例如,数组变量P(以后简称“数组P”)是10个 整数的数组,通过如下说明语句来说名: • int P[10]; 其中,P为数组变量的名称,不是数组类型的名 称;int为数组的元素类型;10为数组元素的个数
这10个元素分别表示如下: P[0],P1],P[2],P[3],P[4],P[5], P[6],P[刀],P[8],P[9] 其中,0,1,2,…,9表示数组元素的下 标,n个元素的最小下标为0,最大下标则 为n-1,而不是n。数组的下标必须在方括 号[]之中
这10个元素分别表示如下: P[0],P[1],P[2],P[3],P[4],P[5], P[6],P[7],P[8],P[9] 其中,0,1,2,…,9表示数组元素的下 标,n个元素的最小下标为0,最大下标则 为n-1,而不是n。数组的下标必须在方括 号[ ]之中
9.2指针类型 在C语言中,指针是一个变量,包含着另一个变 的地址。因此,通过指针可以间接地访问另 变量。 为了熟悉指针定义,我们先看下列两个语句: int x,*px; px =&X 前一个说明语句表示x是一个整型变量,px 是一个指向整数的指针;后一个赋值语句表示将 变量x的地址赋给变量px。其中x是变量,&X表示 x的地址。单目运算符&是一个地址运算符,它用 来产生一个变量的地址
9.2指针类型 • 在C语言中,指针是一个变量,包含着另一个变 量的地址。因此,通过指针可以间接地访问另一 个变量。 为了熟悉指针定义,我们先看下列两个语句: int x, *px; px = &x; 前一个说明语句表示x是一个整型变量,px 是一个指向整数的指针;后一个赋值语句表示将 变量x的地址赋给变量px。其中x是变量,&x表示 x的地址。单目运算符&是一个地址运算符,它用 来产生一个变量的地址
上述语句完成了由变量找地址的工作,下面的语句将完 成由地址找内容的工作 int x, y, *px; px=&X y =pX 上述程序段表示将X的地址赋给px,通过地址运算符来 实现。px作为y的最终地址,px的内容就是y的值,因此y 就等于x 请注意:&x和*x的意义是不相同的,其主要区别为 8x中,x为变量,8X则为x的地址; *x中,x为地址,*x则为以x为地址的那个对象的内容 前者的X通常为整数型变量,后者的x必须是指针
上述语句完成了由变量找地址的工作,下面的语句将完 成由地址找内容的工作。 int x, y, *px; px = &x; y = *px; 上述程序段表示将x的地址赋给px,通过地址运算符来 实现。px作为y的最终地址,px的内容就是y的值,因此y 就等于x。 请注意:&x和*x的意义是不相同的,其主要区别为: &x中,x为变量,&x则为x的地址; *x中,x为地址, *x则为以x为地址的那个对象的内容。 前者的x通常为整数型变量,后者的x必须是指针
指针和整数可以进行加减运算,在这种情况下 首先象加法运算讨论中所指出的那样进行转换 指向同一类型对象的两个指针可以相减,结果转 换成整数,它表示处于两个指针所指对象之间 的对象的个数,但这种转换通常会产生不可预料 的效果。如果两个指针是指向同一个数组,那 是有意义的。两个指针也可以比较,结果依赖于 所指的对象在地址空间中的相对位置。仅当几 个指针指向同一数组的元素时,指针比较才是可 取的。任何指针同NULL(空指针)作相等与不等 的比较都是有意义的
• 指针和整数可以进行加减运算,在这种情况下, 首先象加法运算讨论中所指出的那样进 行转换。 指向同一类型对象的两个指针可以相减,结果转 换成整数,它表示处于两个指针所 指对象之间 的对象的个数,但这种转换通常会产生不可预料 的效果。如果两个指针是指向同 一个数组,那 是有意义的。两个指针也可以比较,结果依赖于 所指的对象在地址空间中的相 对位置。仅当几 个指针指向同一数组的元素时,指针比较才是可 取的。任何指针同NULL(空指针)作相等与不等 的比较都是有意义的
C×51对指针变量进行了扩展,指针变量在Cⅹ51 中定义格式如下 数据类型[存储器类型]*标识符 其中,“标识符”是所定义的指针变量名。 “数据类型”说明了该指针变量所指向的变 量的类型 “存储器类型”是可选项,它是C×51编译 器的一种扩展,如果带有此选项,指针被定义为 基于存储器的指针,无此选项时,被定义为一般 指针。这两种指针的区别在于它们的存储字节不 同。一般指针在内存中占用3个字节,第一个字节 存放该指针存储器类型的编码(由编译时编译模 式的默认值确定),第二和第 字节分别存放 该指针的高位和低位地址偏移量
• Cx51 对指针变量进行了扩展,指针变量在Cx51 中定义格式如下 数据类型[存储器类型] *标识符; 其中,“标识符”是所定义的指针变量名。 “数据类型”说明了该指针变量所指向的变 量的类型。 “存储器类型”是可选项,它是Cx51编译 器的一种扩展,如果带有此选项,指针被定义为 基于存储器的指针,无此选项时,被定义为一般 指针。这两种指针的区别在于它们的存储字节不 同。一般指针在内存中占用3个字节,第一个字节 存放该指针存储器类型的编码(由编译时编译模 式的默认值确定),第二和第三个字节分别存放 该指针的高位和低位地址偏移量
9.3结构类型 数组类型是由一定数量的相同类型的元素组成的。它严格 地要求元素类型必须相同,然而,实际生活中有许多不同 类型的元素具有共同的属主。因此,结构类型是很有用的 例如,表示一个日期可由年、月、日组成,月份用英文缩 写名称,则可以定义一个日期的结构: struct date t int year, month, day; char mon[ 31 上面的描述表明定义了一个结构类型,其类型名称为 date
9.3 结构类型 • 数组类型是由一定数量的相同类型的元素组成的。它严格 地要求元素类型必须相同,然而,实际生活中有许多不同 类型的元素具有共同的属主。因此,结构类型是很有用的。 • 例如,表示一个日期可由年、月、日组成,月份用英文缩 写名称,则可以定义一个日期的结构: struct date { int year, month, day; char mon[ 3]; } 上面的描述表明定义了一个结构类型,其类型名称为 date
9.4联合类型 ●联合( unIon)也是一种类型,它可以在不 同时间内拥有不同类型和不同长度的对象。 其目的是提供一个单一的变量,合理地保 存几种类型中的任何一种变量,从而在 个存储区内管理不同类型的数据,达到节 省存储空间的效果。 联合的语法是以结构为基础的
9.4联合类型 • 联合(union)也是一种类型,它可以在不 同时间内拥有不同类型和不同长度的对象。 其目的是提供一个单一的变量,合理地保 存几种类型中的任何一种变量,从而在一 个存储区内管理不同类型的数据,达到节 省存储空间的效果。 • 联合的语法是以结构为基础的
●我们先看一个联合的说明 union u tag int ival: float foal; char *pval; 3 uva 其中: union是联合的关键字; utag是一种联合类型的名称; uva是联合类型utag的变量; }是描述utag类型可以保存的几种类型的变量。它 们中的任何一种都可以赋给变量uval。 变量uva必须足以容纳最大的成员。被检索的类型必 须是最近存储的类型。程序员的职责就是记录下当前存于 联合中的类型是什么
• 我们先看一个联合的说明. union u_tag { int ival; float foal; char *pval; }uval; 其中: union是联合的关键字; u_tag是一种联合类型的名称; uval是联合类型u_tag的变量; { }是描述u_tag类型可以保存的几种类型的变量。它 们中的任何一种都可以赋给变量uval。 变量uval必须足以容纳最大的成员。被检索的类型必 须是最近存储的类型。程序员的职责就是记录下当前存于 联合中的类型是什么