目录 9.1 结构体类型 9.2 共用体类型 9.3 枚举类型 9.4 类型声明符typedef 1
9.1 结构体类型 1. 结构体类型的定义 结构体类型定义的一般形式: struct 结构体类型名 { 成员变量表列 }; 9.1 结构体类型 1. 结构体类型的定义 结构体类型定义的一般形式: struct 结构体类型名 { 成员变量表列 }; 应注意在括号后的分号是不可少的。成员变量表列由若干个成员变量组成,每个成员变量都是该结构体的一个组成部分。 对每个成员变量也必须作类型声明,其形式为:类型声明符 成员变量名; 结构体类型名和成员变量名的命名应符合标识符的命名规则。 2
9.1 结构体类型 2. 结构体类型变量的定义 1)先定义结构体类型,再定义结构体变量 2)在定义结构体类型的同时定义结构体变量 9.1 结构体类型 2. 结构体类型变量的定义 1)先定义结构体类型,再定义结构体变量 2)在定义结构体类型的同时定义结构体变量 struct 结构体类型名 { 成员变量表列 }结构体类型变量表列; 3)直接定义结构体变量 定义的一般形式为: struct 3
9.1 结构体类型 3. 结构体类型变量的成员变量的表示方法 9.1 结构体类型 3. 结构体类型变量的成员变量的表示方法 在程序中使用结构体类型变量时,除了允许具有相同类型的结构体类型变量相互赋值以外,一般对结构体类型变量的使用,包括赋值、输入、输出、运算等都是通过结构体类型变量的成员变量来实现。 表示结构体类型变量的成员变量一般形式是: 结构体类型变量名.成员变量名 例如:student1.num //即第一个人的学号 如果成员变量本身又是一个结构体类型,则必须逐级找到最低级的成员变量才能使用。例如:person1.birthday.month 表示第一个人出生月份成员变量,可以在程序中单独使用。 4
9.1 结构体类型 4. 结构体类型变量的成员变量的使用方法 9.1 结构体类型 4. 结构体类型变量的成员变量的使用方法 结构体变量的赋值、输入和输出可以通过对其各成员分别进行赋值、输入和输出来实现。结构体变量的赋值就是给其各成员赋值。 【例 9_1】给结构体变量赋值并输出。 #include<stdio.h> void main() { struct stu { int num; char *name; float score; } student1,student2; 5
9.1 结构体类型 4. 结构体类型变量的成员变量的使用方法 student1.num=2012102; 9.1 结构体类型 4. 结构体类型变量的成员变量的使用方法 student1.num=2012102; student1.name="zhang li"; printf("input score\n"); scanf("%f",&student1.score); student2=student1; printf("number=%d\n",student2.num); printf("name=%s\n",student2.name); printf("score=%f\n",student2.score); } 6
9.1 结构体类型 5. 结构体类型变量的初始化及整体赋值 【例9_2】结构体类型变量初始化并整体赋值给另一个结构体变量。 9.1 结构体类型 5. 结构体类型变量的初始化及整体赋值 【例9_2】结构体类型变量初始化并整体赋值给另一个结构体变量。 #include<stdio.h> void main() { struct stu /*定义结构体*/ { int num; char *name; float score; }student2,student1={2012102,"zhang li",88.5}; student2=student1; printf("number=%d\n",student2.num); printf("name=%s\n",student2.name); printf("score=%f\n",student2.score); } 7
9.1 结构体类型 6. 结构体类型数组的定义和使用 定义结构体类型数组的方法和定义结构体类型变量相似,只需定义它为数组类型即可。 9.1 结构体类型 6. 结构体类型数组的定义和使用 定义结构体类型数组的方法和定义结构体类型变量相似,只需定义它为数组类型即可。 对结构体类型数组定义的同时也可以作初始化赋值。例如: struct stu { int num; char *name; float score; }student[3]={{2012101,"li ping",45}, {2012102,"zhang ping",62.5}, {2012103,"he fang",92.5}}; 当对全部元素作初始化赋值时,也可以不给出数组长度。 8
9.1 结构体类型 6. 结构体类型数组的定义和使用 【例9_3】计算学生的平均成绩和不及格的人数。 9.1 结构体类型 6. 结构体类型数组的定义和使用 【例9_3】计算学生的平均成绩和不及格的人数。 #include<stdio.h> struct stu { int num; char *name; float score; } student[3]={{2012101,"li ping",45}, {2012102,"zhang ping",62.5}, {2012103,"he fang",92.5}}; 9
9.1 结构体类型 6. 结构体类型数组的定义和使用 【例9_3】计算学生的平均成绩和不及格的人数。 void main() 9.1 结构体类型 6. 结构体类型数组的定义和使用 【例9_3】计算学生的平均成绩和不及格的人数。 void main() { int i,c=0; float ave,s=0; for(i=0;i<3;i++) { s+=student[i].score; if(student[i].score<60)c+=1; } printf("s=%f\n",s);ave=s/3; printf("average=%f\ncount=%d\n",ave,c); 10
9.2 共用体类型 1. 共用体类型的定义 共用体类型也是一种构造而成的数据类型,在声明和使用之前必须先定义它。 9.2 共用体类型 1. 共用体类型的定义 共用体类型也是一种构造而成的数据类型,在声明和使用之前必须先定义它。 定义共用体类型变量的一般形式为: union 共用体名 { 成员变量表列 }共用体变量表列; 共用体与结构体的定义形式相似,但它们的含义是不同的。结构体变量所占内存长度是各成员占的内存长度之和,每个成员分别占有其自己的内存单元。而共用体变量所占的内存长度等于最长的成员的长度,所有成员共用同一内存单元。 11
9.2 共用体类型 2. 共用体类型变量的使用 只有先定义了共用体变量才能引用共用体变量中的成员。 9.2 共用体类型 2. 共用体类型变量的使用 只有先定义了共用体变量才能引用共用体变量中的成员。 (1)同一个内存可以用来存放几种不同类型的成员,但在每一瞬时只能存放其中一个成员,而不是同时存放多个。 (2)可以对共用体变量初始化,但初始化表中只能有一个常量。 (3)共用体变量中起作用的成员是最后一次被赋值的成员。 (4)共用体变量的地址和它的各成员的地址相同。 (5)不能对共用体变量名赋值,也不能引用变量名。 (6)允许用共用体变量作为函数参数。 (7)共用体类型可以出现在结构体类型定义中,也可以定义共用体数组。反之,结构体也可以出现在共用体类型定义中,数组也可以作为共用体的成员。 12
9.2 共用体类型 2. 共用体类型变量的使用 【例9_4】有若干个人员的数据,其中有学生和教师。学生的数据包括:姓名、号码、职业、班级。教师的数据包括:姓名、号码、职业、职务。学生和教师的数据项目只有一项不同。现要求把它们放在同一表格中。 #include <stdio.h> struct { int num; char name[10]; char job; union { int clas; char posi [10]; }cate; }p[2]; 13
9.2 共用体类型 2. 共用体类型变量的使用 int main() { int i; for(i=0;i<2;i++) 9.2 共用体类型 2. 共用体类型变量的使用 int main() { int i; for(i=0;i<2;i++) { scanf("%d %c %s",&p[i].num,&p[i].job,&p[i].name); if(p[i].job=='s') scanf("%d",&p[i].cate.clas); else if(p[i].job=='t')scanf("%s",p[i].cate.posi); else printf("Input error!"); } printf("\n"); if (p[i].job == 's') printf("%d %s %c %d\n",p[i].num, p[i].name,p[i].job,p[i].cate.clas); else printf("%d %s %c %d\n",p[i].num,p[i].name, p[i].job,p[i].cate.posi); } 14
9.3 枚举类型 2.枚举类型变量的定义 1)先定义枚举类型后定义枚举类型变量 2)同时定义枚举类型和枚举类型变量 1. 枚举类型的定义 9.3 枚举类型 1. 枚举类型的定义 枚举类型定义的一般形式为: enum 枚举名{枚举值表列}; 在枚举值表列中罗列出所有可用值,这些值也称为枚举元素。 2.枚举类型变量的定义 枚举类型变量也可用以下三种不同的定义方式: 1)先定义枚举类型后定义枚举类型变量 2)同时定义枚举类型和枚举类型变量 enum 枚举类型名{枚举值表列}枚举类型变量表列; 3)直接定义枚举类型变量 enum {枚举值表列}枚举类型变量表列; 15
9.3 枚举类型 1)枚举类型的使用规定 3.枚举类型变量的使用 (1)枚举值是常量,不是变量,所以不能在程序中用赋值语句再对它赋值。 9.3 枚举类型 3.枚举类型变量的使用 1)枚举类型的使用规定 (1)枚举值是常量,不是变量,所以不能在程序中用赋值语句再对它赋值。 (2)枚举类型元素本身由系统定义了一个表示序号的数值,从0开始,顺序定义为0,1、2……。 【例9_5】枚举类型变量的使用。 #include<stdio.h> void main() { enum weekday { sun,mon,tue,wed,thu,fri,sat } a,b; a=sun; b=mon; printf("%d,%d\n",a,b); } 16
9.3 枚举类型 (1)只能把枚举值赋给枚举变量。 2)枚举类型的使用说明 3.枚举类型变量的使用 9.3 枚举类型 3.枚举类型变量的使用 2)枚举类型的使用说明 (1)只能把枚举值赋给枚举变量。 (2)一定要把数值赋给枚举变量,则必须用强制类型转换。 (3)枚举元素不是字符型,使用时不要加单引号或双引号。 【例9_6】 #include<stdio.h> void main() { enum body { a,b,c,d } month[31],j; int i; j=a; for(i=1;i<=30;i++) { month[i]=j; j++; if (j>d) j=a; } 17
9.3 枚举类型 2)枚举类型的使用说明 3.枚举类型变量的使用 { switch(month[i]) 9.3 枚举类型 3.枚举类型变量的使用 2)枚举类型的使用说明 for(i=1;i<=30;i++) { switch(month[i]) { case a:printf(" %2d %c\t",i,'a'); break; case b:printf(" %2d %c\t",i,'b'); break; case c:printf(" %2d %c\t",i,'c'); break; case d:printf(" %2d %c\t",i,'d'); break; default:break; } } printf("\n"); 18
宏定义是由预处理完成的,而typedef则是在编译时完成的,所以,后者更为灵活方便。 宏定义虽然也可表示数据类型,但毕竟只是做字符代换。 19