单片机教学第2章数据类型.ppt_第1页
单片机教学第2章数据类型.ppt_第2页
单片机教学第2章数据类型.ppt_第3页
单片机教学第2章数据类型.ppt_第4页
单片机教学第2章数据类型.ppt_第5页
已阅读5页,还剩89页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

2019年8月3日2时21分,1,第2章 C+ 数据类型,2.1 数据类型 2.2 常量 2.3 变量 2.4 运算符与表达式 2.5 复合数据类型,C+程序设计,2019年8月3日2时21分,2,数据类型是指定义了一组数据以及定义在这一组数据的操作,它是程序中最基本的元素。 C+数据类型十分丰富,大体上可分为基本类型、复合数据类型两种。,2019年8月3日2时21分,3,2.1 数据类型,2.1.1 基本类型 基本数据类型有六种:整型(int)、浮点型(float)、字符型(char)、双精度浮点型(double)、逻辑型(bool)和无值型(void)。 整型数在计算机内部一般采用定点表示法,用于存储整型量。(如123,-7等),存储整数的位数依机器的不同而异。 浮点数和整数不同的地方是浮点数采用的是浮点表示法,也就是说,浮点数的小数点的位置不同,给出的精度也不相同。 字符类型表示单个字符,一个字符用一个字节存储。 逻辑类型,也称布尔类型,表示表达式真和假。 无值型数据一般表示函数无值返回。,2019年8月3日2时21分,4,整型int: 2字节 -3276832767 无符号整型unsigned int:2字节 065535 字符型char: 1字节 -128127 浮点型float: 4字节 3.4e-383.4e38 双精度型double:8字节 1.7e-3081.7e308,C+提供的数据类型,2019年8月3日2时21分,5,使用sizeof()运算符求字节数,void main() cout“The size of an int is:“sizeof(int)“bytesn“; cout“The size of a short int is: “sizeof(short)“bytesn“; cout“The size of a long int is: “sizeof(long)“bytesn“; cout“The size of a char is: “sizeof(char)“bytesn“; cout“The size of a float is: “sizeof(float)“bytes.n“; ,程序输出结果: The size of an int is: 2bytes. The size of a short int is: 2bytes. The size of a long int is: 4bytes. The size of a char is: 1bytes. The size of a float is: 4bytes.,2019年8月3日2时21分,6,2.1.2 空类型void 空类型void用于显示说明一个函数不返回任何值。还可以说明指向void类型的指针,说明以后,这个指针就可指向各种不同类型的数据对象。,2019年8月3日2时21分,7,2.1.3 构造类型 构造类型又称为组合类型,它是由基本类型按照某种规则组合而成的。 数组:是由具有相同数据类型的元素组成的集合。 结构体:是由不同的数据类型构成的一种混合的数据结构,构成结构体的成员的数据类型一般不同,并且在内存中分别占据不同的存储单元。 共用体:是类似于结构体的一种构造类型,与结构体不同的是构成共同体的数据成员共用同一段内存单元。 枚举:是将变量的值一一列举出来,变量的值只限于列举出来的值的范围内。,2019年8月3日2时21分,8,2.2 常量和变量 2.2 .1 常 量,常量是指在程序运行过程中其值不能改变的量。C+支持5种类型的常量:浮点型、整型、字符型、布尔型和枚举型。常量在程序中一般以自身的存在形式体现其值。常量具有类型属性,类型决定了各种常量在内存中占据存储空间的大小。,2019年8月3日2时21分,9,1、整型常量,有3种表示方式: 十进制整数 八进制整数(以0开头的整数) 十六进制整数(以0X或0x开头的整数) 如: 123,-34,0 0123(=1*82+2*81+3*80) /等于数83 0X123 /等于数291 -024,-0X32 /不正确 123L /长整型数 123LU /无符号长整型数,2019年8月3日2时21分,10,有两种表示: 定点数形式 指数形式 如: 0.123,.23,0.0 /定点数形式 123E5,23.4e-2 /指数形式 要注意E或e的前面要有数字,且E的后面的指数必须为整数。 E2,2.1E3.5,e /不合法 实型常数分为单精度、双精度和长双精度3类。 如:34.5 、3.8f、 34.6l 在C+中,一个实型常数未说明则表示是double型。,2、浮点型常量,2019年8月3日2时21分,11,是用单引号括起来的一个字符。如a、! 等。 此外,还有一种特殊形式,即以 开头的字符序列,称为转义字符。 如 n ,它表示一个换行符。 转义字符中可将反斜杠同八进制或十六进制数值结合使用,以表示相应于该数值的ASCII码。 用八进制数表示时,所能表示的范围为 000377,即从0255。 用十六进制数表示时,表示的范围是x00xff。,3、字符型常量,2019年8月3日2时21分,12,是由一对双引号括起来的字符序列。 如: “ How do you do? “ 、 “ hello “字符常量和字符串常量在存储方式上是不同的。 字符常量只占一个字节的空间,而字符串常量除字符序列中每个字符占一个字节外,还要在最后多占一个字节空间用来保存一个0字符(空字符)称为字符串结束标志符号。它是系统自动增加的。 如: “ hello “ 的长度为6,占6个内存单元。 注意: “0“与0的不同。,4、字符串常量,2019年8月3日2时21分,13,5、符号常量,用一个与常量相关的标识符来替代常量出现在程序中,这种相关的标识符称为符号常量。 定义方法须用类型说明符const。 如: const float pi=3.14159; 定义成符号常量后,程序中对其值只能读而不能改变,否则出现编译错误。 由于其常量值不可改变,所以该常量定义时必须初始化。 注: 符号常量名不能放在赋值语句的左边。,2019年8月3日2时21分,14,表2-1 常用的特殊字符,2019年8月3日2时21分,15,6 布尔常量 布尔常量仅有两个:false(假)和true(真)。,2019年8月3日2时21分,16,7 枚举常量 枚举常量可以通过建立枚举类型来定义。 枚举类型是一种用户自定义数据类型。在声明枚举类型时,需要把常量的值一一列举出来,形式如下: enum 枚举类型名 常量值1 ,常量值2 ,常量值n; 例如声明一个名为color的枚举类型: enum colorRed,Green,Blue,White,Black; 枚举常量是一种符号常量。Red,Green等是符号常量,它们表示各个枚举值,在内存中表示以整型数。如果没有专门指定,第一个符号常量的枚举值就是0,其他枚举值依次为1,2,3。所以,C+自动给Red赋0,Green赋1,等等。,2019年8月3日2时21分,17,2.2.2 变 量,变量是指程序在运行时其值可改变的量。每个变量由一个变量名唯一标识,同时,每个变量又具有一个特定的数据类型。不同类型的变量在内存中占有存储单元的个数不同。,2019年8月3日2时21分,18,1 变量名命名 变量名的命名要遵守以下规则: 不能是C+保留字。C+的保留字如表2-2所列。 第一个字符必须是字母或下划线,中间不能有空格。 变量名除了使用26个英文大小写字母和数字外,只能使用下划线。 一般不要超过31个字符。 变量名不要与C+中的库函数名、类名和对象名相同。 请问:下列变量名是合法的吗? a123 2dEg_1 c3b_1 file_1 _233 d$2_q,2019年8月3日2时21分,19,表2-2 C+的标准保留字,2019年8月3日2时21分,20,2 变量定义和说明 C+中,变量使用之前一定要定义或说明,变量定义的格式一般为: 修饰符 类型 变量名; /注释 其中,类型指出变量所存放的数据的类型;变量名是任意合法的变量名;注释指明该变量的含义和用途;修饰符进一步描述了变量的使用方式。修饰符和注释是任选的,可以没有。,2019年8月3日2时21分,21,多个同一类型的变量可以在一行中定义,中间用逗号隔开,也可以分别定义。 例如: int a,b,c; /定义3个整型变量a,b,c 和 int a; /定义整型变量a int b; /定义整型变量b int c; /定义整型变量c 二者等价。,2019年8月3日2时21分,22,3 变量初始化 变量初始化一般采用两种方式。 第一种方式是在定义变量时可以给变量赋一个初值,例如: int a=3; float b=3.4; const int c=5; 第二种方式是先定义变量,然后通过赋值语句使变量初始化,例如: int a; a=3;,2019年8月3日2时21分,23,修饰符 volatile Register Static Extern Auto Long Short Double Signed unsigned,2019年8月3日2时21分,24,2.3 运算符与表达式,在程序中,表达式是计算求值的基本单位,它是由运算符和运算数组成的式子。运算符是表示进行某种运算的符号。运算数包含常量、变量和函数等。 C+语言的运算符按其在表达式中与运算对象的关系(连接运算对象的个数)可分为: 单目运算(一元运算符,只需一个操作数) 双目运算(二元运算符,需两个操作数) 三目运算(三元运算符,需三个操作数),2019年8月3日2时21分,25,按其在表达式中所起的作用又可分为: 算术运算符 + - * / % 关系运算符 = = != 逻辑运算符 ! & | 位运算符 | & 自增自减运算符 + - 赋值运算符 = 及其扩展(+= -= *= /= %= 等) 条件运算符 ? : (三目运算符) 指针运算符 * 和 & 逗号运算符 , 分量运算符 . - 函数调用运算符() 下标运算符 求字节运算符 sizeof 强制类型转换运算符:(type),2019年8月3日2时21分,26,2.3.1 算术运算符 算术运算符有双目运算和单目运算两种。包括: +(加法运算符,或正值运算符,如1+2,+3) - (减法运算符,或负值运算符,如1-2,-3) *(乘法运算符,如1*2) / (除法运算符,如1/2) %(模运算符或称求余运算符,如7%3=1),2019年8月3日2时21分,27,2.3.2 赋值运算符 (1)赋值运算符“=”的一般格式为: 变量=表达式; 表示将其右侧的表达式求出结果,赋给其左侧的变量。例如: int i; i=3*(4+5); /i的值变为27 (2)赋值表达式本身的运算结果是右侧表达式的值,而结果类型是左侧变量的数据类型。例如: int i=1.2*3; /结果为3,而不是3.6,2019年8月3日2时21分,28,(3)赋值运算符的结合性是从右至左的,因此,C+程序中可以出现连续赋值的情况。例如,下面的赋值是合法的: int i,j,k; i=j=k=10; /i,j,k都赋值为10 (4)复合运算符: +=(加赋值), -=(减赋值), *=(乘赋值), /=(除赋值), %=(取模赋值), =(右移赋值), &=(与赋值), =(异或赋值), |=(或赋值),2019年8月3日2时21分,29,它们的含义如下: a+=b 等价于 a=a+b a-=b 等价于 a=a-b a*=b 等价于 a=a*b a/=b 等价于 a=a/b a%=b 等价于 a=a%b a=b 等价于 a=ab a&=b 等价于 a=a&b a=b 等价于 a=ab a|=b 等价于 a=a|b,2019年8月3日2时21分,30,例如: int a=12; a+=a; 表示 a=(a+a)=(12+12)=24; 又例如: int a=12; a+=a-=a*=a; 表示 a=a*a /a=12*12=144 a=a-a /a=144-144=0 a=a+a /a=0+0=0,2019年8月3日2时21分,31,2.3.3 关系运算符 (1)关系运算符用于两个值进行比较,运算结果为true(真)或false(假),分别用值非0(true)或0(false)表示。C+中的关系运算符如下: (大于), =(大于等于), =(等于), !=(不等于), (2)关系运算符都是双目运算符,其结合性是从左到右,、=运算符的优先级相同,=和!=运算符的优先级相同,前者运算的优先级高于后者。 (3)关系运算符的优先级低于算术运算符。 例如: a+bc 等价于 (a+b)c a!=bc 等价于 a!=(bc),2019年8月3日2时21分,32,逻辑运算符 &(逻辑与), |(逻辑或),!(逻辑非) 逻辑表达式的结果为真则为1,结果为假则为0。 逻辑非(!)是单目运算符,逻辑与(&)与逻辑或(|)为双目运算符。 逻辑非的优先级最高,逻辑与次之,逻辑或最低。 逻辑运算真值表如表2-3所示。,2019年8月3日2时21分,33,表2-3 逻辑运算真值(真为非0,假为0),2019年8月3日2时21分,34,2.3.4 自增、自减运算符 (1)自增(+)、自减(-)运算符为变量的增1和减1提供了紧凑格式。 (2)自增、自减运算符都是单目运算符,其作用是使变量的值增1或减1。 (3)自增、自减运算符有四种应用格式: int a=3;b=a+; 等价于 b=a;a=a+1; int a=3;b=a-; 等价于 b=a;a=a-1; (运算符后置用法,代表先使用变量,然后对变量增值) int a=3;b=+a; 等价于 a=a+1;b=a; int a=3;b=-a; 等价于 a=a-1;b=a; (运算符前置用法,代表先对变量增值,再使用变量),2019年8月3日2时21分,35,(4)C+编译器在处理时尽可能多的自左向右将运算符结合在一起。 例如:a+b表示为(a+)+b而不是a+(+b)。,2019年8月3日2时21分,36,2.3.5 条件运算符 (1)条件运算符“?:”是C+中唯一三目运算符,其形式为: 表达式1 ?表达式2 :表达式3 它的运算方式为:先计算表达式1的值,如果其值为非0(真),则表达式2的值就是整个表达式的最终结果;否则表达式3的值就是整个表达式的值。常见的一个例子为: max=(ab)?a:b) 上面例子定义了一个求两个数a和b中最大值,其中决定哪一个是最大值用了条件运算符。,2019年8月3日2时21分,37,(2)条件运算符的结合性是自右向左。例如有以下条件表达式: ab?a:cd?c:d 相当于 ab?a:(cd?c:d) (3)条件运算符的优先级别高于赋值运算符,低于关系运算符和算术运算符。例如有: ab?a-b:b-a 相当于 ab?(a-b):(b-a),2019年8月3日2时21分,38,2.3.6 位运算符 (1)位(bit)是计算机中表示信息的最小单位,一般用0和1表示。一个字符在计算机中用8个位表示,8个位组成一个字节。C+语言需要将人们通常所习惯的十进制数表示为二进制、八进制或十六进制数来理解对位的操作。C+中所有的位运算符如下: (按位求反), (右移), &(按位与), (按位异或), |(按位或)。 (2)位运算符是对其操作数按其二进制形式逐位进行运算,参加位运算的操作数必须为整数。,2019年8月3日2时21分,39,2.3.7 sizeof运算符(求字节运算符) (1)sizeof运算符是单目运算符,用于计算运算对象在内存中所占字节的多少,它有两种形式: sizeof (类型标识符); sizeof 表达式; (2)sizeof可以接受的类型标识符很多,如sizeof(int)表示求整型数据在内存中所占字节数。 例如:int a,则sizeof(a)表示求变量a在内存中所占字节数。 例如:int a10,则sizeof(a)表示求数组a在内存中所占字节数。,2019年8月3日2时21分,40,逗号运算符 (1)逗号运算符用于将多个表达式连在一起,并将各表达式从左到右的顺序依次求值,但只有其最右端的表达式的结果,作为整个逗号表达式的结果。 (2)逗号表达式的一般格式为: 表达式1,表达式2,表达式n 例如: int a=3,b=4,c=5; a+b,b+c,c+a; 则先求解a+b,再求解b+c,最后求解c+a,整个表达式的结果为c+a的结果。,2019年8月3日2时21分,41,2.3.8 运算符优先级 (1)运算符优先级决定了在表达式中各个运算符执行的先后顺序。高优先级运算符先于低优先级运算符进行运算。在优先级相同的情形下,则按从左到右的顺序进行运算。 (2)当表达式中出现了括号时,会改变优先级。先计算括号中的子表达式值,再计算整个表达式的值。 相关教材列出了C+的所有运算符集,依优先级从高到低排列。,2019年8月3日2时21分,42,(3)运算符的结合方式有两种:左结合和右结合。左结合表示运算符优先与其左边的标识符结合进行运算,如加法;右结合表示运算符优先与其右边的标识符结合,如单目运算符+、-。 (4)同一优先级的优先级别相同,运算次序由结合方向决定。如1*2/3,*和/的优先级别相同,其结合方向自左向右,则等价于(1*2)/3。 (5)不同的运算符要求有不同的运算对象个数,单目运算符只需一个运算对象,如 i+,-a,sizeof(b)等。,2019年8月3日2时21分,43,优先级排列表,2019年8月3日2时21分,44,(续),2019年8月3日2时21分,45,2.3.9 表达式 表达式是用于计算的式子,它由运算符、运算数和括号组成。最简单的表达式只有一个常量或变量,当表达式中有两个或多个运算符时,表达式称为复杂表达式,其中运算符执行的先后顺序由它们的优先级和结合性决定。执行表达式所规定的运算,所得到的结果值便是表达式的值。 C+中由于运算符很丰富,因此表达式的种类也很多。常用的表达式有6种。,2019年8月3日2时21分,46,1. 算术表达式 由算术运算符和位操作运算符组成的表达式。其表达式的值是一个数值,表达式的类型由运算符和运算数确定。 例如, a+3*(b/2)就是一个算术表达式。 2. 逻辑表达式 由逻辑运算符组成的表达式。其表达式的值的类型为逻辑型,一般地,真用1表示,假用0表示。 例如,!a&b|c就是一个逻辑表达式。,2019年8月3日2时21分,47,3. 关系表达式 由关系运算符组成的表达式。其表达式的值的类型为逻辑型,一般地,真用1表示,假用0表示。 例如,ab!=c就是一个关系表达式。 4. 赋值表达式 由赋值运算符组成的表达式。 例如,已知a=b就是一个赋值表达式。,2019年8月3日2时21分,48,5. 条件表达式 由三目运算符组成的表达式。条件表达式的值取决于?号前面的表达式,该表达式的值为非0时,整个表达式的值为:号前面表达式的值,否则为:号后面表达式的值。条件表达式的类型是:号前和:号后两个表达式中类型高的一个表达式的类型。 例如,ab?a:b就是一个条件表达式。 6. 逗号表达式 用逗号将若干个表达式连起来组成的表达式。该表达式的值是组成逗号表达式的若干个表达式中最后一个表达式的值,类型也是最后一个表达式的类型。逗号表达式计算值的顺序是从左至右逐个表达式分别计算。 例如,a+3,b+4,c+5就是一个逗号表达式。,2019年8月3日2时21分,49,2.4.12 数据类型转换 C+中数据类型转换有两类,即隐式类型转换和显式类型转换。 1. 隐式类型转换 隐式类型转换是由编译器自动完成的类型转换。当编译器遇到不同类型的数据参与同一运算时,会自动将它们转换为相同类型后再进行运算,赋值时会把所赋值的类型转换为与被赋值变量类型一样。隐式类型转换按从低到高的顺序进行,如图2-2所示。,2019年8月3日2时21分,50,图2-2 数据类型转换的顺序,2019年8月3日2时21分,51,2.强制数据类型转变,强制转换是通过类型转换运算符来实现。 一般形式:(类型说明符)表达式 功能:把表达式的结果强制转换为类型说明符所表示的类型。 例如: (int)a 将a的结果强制转换为整型量。 (int)(x+y) 将x+y的结果强制转换为整型量。 (float)a+b 将a的内容强制转换为浮点数,再与b相加 说明: (1)类型说明和表达式都需要加括号(单个变量可以不加括号) (2)无论隐式转换,强制转换都是临时转换,不改变数据本身的类型和值。,2019年8月3日2时21分,52,例题,main() float f=5.75; printf(“(int)f=%dn“,(int)f); /* 将f的结果强制转换为整型,输出 */ printf(“f=%fn“,f); /* 输出f的值 */ 结果: (int)f=5 f=5.750000,2019年8月3日2时21分,53,2.5.1枚举类型 enum 类型又称枚举类型,它是一种由用户参与定义的类型。 所谓“枚举”是指将变量的值一一列举出来,变量的值只限于列举出来的值的范围内。 如果一个变量只有几种可能的值,可以定义为枚举类型。,2.5 复合数据类型,2019年8月3日2时21分,54,定义枚举的方法: enum 枚举名符号表; 如:enum weekdaySum,Mon,Tue,Wed,Thu,Fri,Sat; 上述定义中定义了Sum,Mon,Tue等7个符号,分别表示星期日、星期一、星期二星期六。有了上述定义,weekday本身就成为一个类型说明符,因而可以像char、int那样用于定义变量或函数,例如: weekday w1,w2=Sat;,2019年8月3日2时21分,55,枚举型与整型的关系: 枚举中的符号与整数有一一对应的关系,因此枚举中的符号可以像一般整数那样使用。如: Sun0 Mon1 Sat6 也可以任意规定其对应关系,例如: enum weekdaySun,Mon=2,Tue,Wed=5,Thu,Fri,Sat 此时:Sun=0 Mon=2 Tue=3 Wed=5 Sat=8,2019年8月3日2时21分,56,n 个枚举值全未赋常量值时,它们自左至右分别与整数0n- 1 对应。 若第i 个枚举值赋常量值为整数m,则其未赋常量值的后续枚举值陆续递增,直到下一个赋了值的枚举值或结束。 枚举类型变量只能赋予其值表中的值,且不能直接赋予数值。 同一枚举中的枚举子的取值不需要唯一。,关于enum 类型有四点说明:,2019年8月3日2时21分,57,枚举的用途,写程序时,我们常常需要为某个对象关联一组可选属性,例如:学生的成绩分A,B,C,D等,天气分sunny,cloudy,rainy等等。 当然,不用枚举常量而直接用常数代表A,B,C,D等也可以。但是: (1)用枚举变量更直观,因为枚举元素都选用了令人“见名知意”的标识符。 (2)枚举变量的值限制在定义时规定的几个枚举元素范围内,如果赋予它一个其他的值,就会出现错误信息,便以检查。,2019年8月3日2时21分,58,2.4.2 结构体,在实际的处理对象中,有许多信息是由多个不同类型的数据组合在一起进行描述,而且这些不同类型的数据是互相联系组成了一个有机的整体。 此时,就要用到一种新的构造类型数据结构体(structure),简称结构。结构体的使用为处理复杂的数据结构(如动态数据结构等)提供了有效的手段,而且,它们为函数间传递不同类型的数据提供了方便。,2019年8月3日2时21分,59,定义一个结构体类型的一般形式为: struct 结构体名 数据类型 成员名1; 数据类型 成员名2; : 数据类型 成员名n; ; 在大括号中的内容也称为“成员表列”或“域表”。其中,每个成员名的命名规则与变量名相同;数据类型可以是基本变量类型和数组类型,也可以是指针变量类型,或者是一个结构体类型;用分号“;”作为结束符。整个结构的定义也用分号作为结束符,,2019年8月3日2时21分,60,例如:定义一个职工worker结构体如下: struct worker long number; char name20; char sex; int age; /age是成员名 float salary; char address80; char phone20; ; /注意分号不要省略 int age=10; /age是变量名,2019年8月3日2时21分,61,结构体类型中的成员名可以与程序中的变量名相同,二者并不代表同一对象,编译程序可以自动对它们进行区分。 最后,总结一下结构体类型的特点: (1)结构体类型是用户自行构造的。 (2)它由若干不同的基本数据类型的数据构成。 (3)它属于C+语言的一种数据类型,与整型、实型相当。因此,定义它时不分配空间,只有用它定义变量时才分配空间。,2019年8月3日2时21分,62,结构体类型变量的定义方法,结构体只是用户自定义的一种数据类型,因此要通过定义结构体类型的变量来使用这种类型。通常有三种形式来定义一个结构体类型变量,分别说明如下: 先定义结构体类型再定义变量名 这是C+语言中定义结构体类型变量最常见的方式,一般语法格式如下: struct 结构体名 成员表列; ; struct 结构体名 变量名;,2019年8月3日2时21分,63,例如,定义几个职工变量: struct worker long number; char name20; char sex; int age; float salary; char address80; char phone20; ; struct worker worker1,worker2;,2019年8月3日2时21分,64,注意:“struct worker”代表类型名,不能分开写为: struct worker1,worker2; /错误,没有指明是哪种结构体类型 或 worker worker1,worker2; /错误,没有struct关键字 /系统不认为worker是结构体类型 为了使用上的方便,程序员通常用一个符号常量代表一个结构体类型。即在程序开头加上下列语句: #define WORKER struct worker; 这样在程序中,WORKER与struct worker完全等效。,2019年8月3日2时21分,65,例如: WORKER long number; char name20; char sex; int age; float salary; char address80; char phone20; ; WORKER worker1,worker2; 此时,可以直接用WORKER定义worker1、worker2两个变量,而不必再写关键字struct。,2019年8月3日2时21分,66,如果程序规模比较大,往往将对结构体类型的定义集中写入到一个头文件(以.h为后缀)中。哪个源文件需用到此结构体类型则可用#include命令将该文件包含到本文件中。这样做便于程序的修改和使用。 在定义类型的同时定义变量 这种形式的定义的一般形式为: struct 结构体名 成员表列; 变量名;,2019年8月3日2时21分,67,例如: struct worker long number; char name20; char sex; int age; float salary; char address80; char phone20; worker1,worker2; 此例与前例作用相同,都定义了两个变量worker1、worker2,它们是结构体类型struct worker。,2019年8月3日2时21分,68,直接定义结构类型变量 其一般形式为: struct /没有结构体名 成员表列 变量名;,2019年8月3日2时21分,69,例如: struct long number; char name20; char sex; int age; float salary; char address80; char phone20; worker1,worker2;,2019年8月3日2时21分,70,一个结构体变量占用内存的实际大小,也可以利用sizeof运算求出。它的运算表达式为: sizeof(运算量) /求出给定的运算量占用内存空间的字节数 其中运算量可以是变量、数组或结构体变量,也可以是数据类型的名称。 例如: sizeof(struct worker) sizeof(worker1),2019年8月3日2时21分,71,结构体变量的使用形式 在定义了结构体变量以后,就可以使用这个变量。结构体变量是不同数据类型的若干数据的集合体。在程序中使用结构体变量时,一般情况下不能把它作为一个整体参加数据处理,而参加各种运算和操作的是结构体变量的各个成员项数据。 结构体变量的成员用以下一般形式表示: 结构体变量名.成员名 例如,上节给出的结构体变量worker1具有下列七个成员: worker1.number;;worker1.sex; worker1.age;worker1.salary;worker1.address; worker1.phone,2019年8月3日2时21分,72,在定义了结构体变量后,就可以用不同的赋值方法对结构体变量的每个成员赋值。例如: strcpy(,”Zhang San”); worker1.age=26; strcpy(worker1.phone,”1234567”); worker1.sex=m; : : 除此之外,还可以引用结构体变量成员的地址以及成员中的元素。例如:引用结构体变量成员的首地址&;引用结构体变量成员的第二个字符1;引用结构体变量的首地址&worker1。,2019年8月3日2时21分,73,在使用结构体类型变量时有以下几点需要加以注意: (1)不能将一个结构体类型变量作为一个整体加以引用,而只能对结构体类型变量中的各个成员分别引用。 例如,对上面定义的结构体类型变量wan,下列引用都是错误的: coutwan; 但是可以如下引用: ;,2019年8月3日2时21分,74,(2)如果成员本身又属一个结构体类型,则要用若干个成员运算符,一级一级地找到最低的一级成员。只能对最低级的成员进行赋值或存取以及运算。例如,对上面定义的结构体类型变量worker1,可以这样访问各成员: worker1.age worker1.birthday. year worker1.birthday. month worker1.birthday. day 注意:不能用worker1.birthday来访问worker1变量中的成员birthday,因为birthday本身是一个结构体变量。,2019年8月3日2时21分,75,(3)对成员变量可以像普通变量一样进行各种运算(根据其类型决定可以进行的运算)。例如: worker2.age=worker1.age; sum=worker1.age+worker2.age; worker1.age+; (4)在数组中,数组是不能彼此赋值的,而结构体类型变量可以相互赋值。 在C+程序中,同一结构体类型的结构体变量之间允许相互赋值,而不同结构体类型的结构体变量之间不允许相互赋值,即使两者包含有同样的成员。,2019年8月3日2时21分,76,结构体变量的初始化 与其他类型变量一样,也可以给结构体的每个成员赋初值,这称为结构体的初始化。有两种初始化形式,一种是在定义结构体变量时进行初始化,一般语法格式如下: struct 结构体名 变量名=初始数据表; 另一种是在定义结构体类型时进行结构体变量的初始化。一般语法格式如下: struct 结构体名 成员表列; 变量名=初始数据表;,2019年8月3日2时21分,77,例如,前述student结构体类型的结构体变量wan在说明时可以初始化如下: struct student wan=”Wan Jun”,m,20,” SuZhou Road No.100”; 它所实现的功能,与下列分别对结构体变量的每个成员赋值所实现的功能相同: strcpy(,” Wan Jun”); wan.sex=m; wan.age=20; wan.addr=” SuZhou Road No.100”;,2019年8月3日2时21分,78,2.4.3 共用体,共用体的概念 在C+语言中,不同数据类型的数据可以使用共同的存储区域,这种数据构造类型称为共用体,简称共用,又称联合体。共用体在定义、说明和使用形式上与结构体相似。两者本质上的不同仅在于使用内存的方式上。 定义一个共用体类型的一般形式为: union 共用体名 成员表列; ;,2019年8月3日2时21分,79,例如: union gy int i; char c; float f; ; 就定义了一个共用体类型union gy,它由三个成员组成,这三个成员在内存中使用共同的存储空间。由于共用体中各成员的数据长度往往不同,所以共用体变量在存储时总是按其成员中数据长度最大的成员占用内存空间。如上述共用体类型union gy的变量占用4个字节的内存。,2019年8月3日2时21分,80,在这一点上共用体与结构体不同,结构体类型变量在存储时总是按各成员的数据长度之和占用内存空间。 例如,定义了一个结构体类型: struct gy int i; char c; float f; ; 则结构体类型struct gy的变量占用的内存为2+1+4=7个字节 。,2019年8月3日2时21分,81,定义共用体类型变量的方法与定义结构体类型变量的方法相似,也有三种方法 : 1、union 共用体名 成员表列; 变量表列; 例如: union gy int i; char c; float f; a,b,c;,2019年8月3日2时21分,82,2、将共用体类型定义与共用体变量定义分开: union gy int i; char c; float f; ; union gy a,b,c;,3、直接定义共用体变量: union int i; char c; float f; a,b,c;,上面几种方法都是定义了一个共用体类型union data,又定义了几个共用体类型变量a,b,c。,2019年8月3日2时21分,83,与结构体类型,也可以定义共用体指针和共用体数组。 union 共用体名 *共用指针名; union 共用体名 数组名元素个数; 例如: union gy *pu; union gy u13; 分别定义了共用体指针pu和共用体数组u13。,2019年8月3日2时21分,84,共用体变量的使用形式 由于共用体变量的各个成员使用共同的内存区域,所以共用体变量的内存空间在某个时刻只能保持某个成员的数据。由此可知,在程序中参加运算的必然是共用体变量的某个成员,而不能直接使用共用体变量。共用体变量成员的表现形式与结构体相同,它们也使用访问成员运算符“.”和“-”表示。 例如,前面定义了a,b,c为共用体类型变量,下面的使用形式是正确的: a.i 引用共用体变量中的整型变量i a.c 引用共用体变量中的字符变量c a.f 引用共用体变量中的实型变量f,2019年8月3日2时21分,85,不能只引用共用体类型变量,例如:couta是错误的,a的存储区有好几种类型,分别占不同长度的存储区,仅写共用体类型变量名a难以使系统确定究竟输出的是那一个成员的值。应该写成couta.i或者couta.c等。 在使用共用体类型变量的数据时要注意:在共用体类型变量中起作用的成员是最后一次存放的成员,在存入一个新的成员后原有的成员就失去作用。如有以下赋值语句: a.i=1; a.c=a; a.f=1.5; 在完成以上三个赋值运算以后,a.f是有效的,a.i和a.c已经无意义了。,2019年8月3日2时21分,86,共用体类型变量可以向另一个相同共用体类型的变量赋值。此外,共用体类型变量可以作为参数传递给函数,也可以使用地址传送方式把共用体类型变量的地址作为参数在函数间传递。 在程序中经常使用结构体与共用体相互嵌套的形式。即共用体类型的成员可以是结构体类型,或者结构体

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论