《C语言第7章结构体与共用体(重庆交大版).ppt》由会员分享,可在线阅读,更多相关《C语言第7章结构体与共用体(重庆交大版).ppt(99页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、1第第7章章结构体与链表结构体与链表7.17.1结构体类型的定义结构体类型的定义结构体类型的定义结构体类型的定义7.27.2结构体类型变量的定义、引用和实始化结构体类型变量的定义、引用和实始化结构体类型变量的定义、引用和实始化结构体类型变量的定义、引用和实始化7.37.3结构体数组结构体数组结构体数组结构体数组7.47.4指针在结构体中应用指针在结构体中应用指针在结构体中应用指针在结构体中应用7.57.5结构体应用举例结构体应用举例结构体应用举例结构体应用举例7.67.6共用体共用体共用体共用体7.77.7枚举类型枚举类型枚举类型枚举类型7.87.8自定义数据类型自定义数据类型自定义数据类型自
2、定义数据类型7.97.9顺序表顺序表顺序表顺序表7.107.10链表链表链表链表27.1结构体类型的定义结构体类型的定义结构体是具有不同类型的数据的有序集合结构体是具有不同类型的数据的有序集合结构体是具有不同类型的数据的有序集合结构体是具有不同类型的数据的有序集合结构体是具有不同类型的数据的有序集合结构体是具有不同类型的数据的有序集合结构体定义:结构体定义:结构体定义:结构体定义:structstructstruct结构体类型名结构体类型名结构体类型名结构体类型名结构体类型名结构体类型名类型标识符类型标识符类型标识符类型标识符类型标识符类型标识符成员名成员名成员名成员名成员名成员名1;1;1;
3、类型标识符类型标识符类型标识符类型标识符类型标识符类型标识符成员名成员名成员名成员名成员名成员名2;2;2;类型标识符类型标识符类型标识符类型标识符类型标识符类型标识符成员名成员名成员名成员名成员名成员名n;n;n;;structstruct:定义结构体类型的关键字;定义结构体类型的关键字;定义结构体类型的关键字;定义结构体类型的关键字;域域域域:结构体类型定义中的每结构体类型定义中的每结构体类型定义中的每结构体类型定义中的每1 1个成员;个成员;个成员;个成员;成员名的命名规则和变量相同,成员名的命名规则和变量相同,成员名的命名规则和变量相同,成员名的命名规则和变量相同,同一结构体的同层成员
4、不可同同一结构体的同层成员不可同同一结构体的同层成员不可同同一结构体的同层成员不可同名。名。名。名。3例:定义结构体类型例:定义结构体类型studentstructstudentstructstudentintnum;intnum;charname20;charname20;charsex;charsex;intage;intage;floatscore;floatscore;charaddr30;charaddr30;numnamesexagescoreaddrnumnamesexagescoreaddr101WGJM2888.5CS101WGJM2888.5CSstructstudents
5、tructstudent应作为一个应作为一个应作为一个应作为一个整体对待,整体对待,整体对待,整体对待,“;”号不能少号不能少号不能少号不能少!47.2结构体类型变量的定义、引用和初始化结构体类型变量的定义、引用和初始化结构体变量的定义结构体变量的定义一、先定义结构体类型再定义变量名一、先定义结构体类型再定义变量名形式:形式:struct结构体名结构体名结构体变量名表结构体变量名表例:例:在前面已定义结构体类型在前面已定义结构体类型structstudent则则可定义可定义:structstudentstu1,stu2;stu1,stu2即为即为structstudent类型的变量类型的变量5
6、二、在定义类型的同时二、在定义类型的同时二、在定义类型的同时二、在定义类型的同时定义变量定义变量定义变量定义变量一般形式为:一般形式为:一般形式为:一般形式为:structstruct结构体名结构体名结构体名结构体名 成员表列成员表列成员表列成员表列 变量名表列变量名表列变量名表列变量名表列;structstudentstructstudentintnum;intnum;charname20;charname20;charsex;charsex;intage;intage;floatscore;floatscore;charaddr30;charaddr30;student1,student2
7、student1,student2;6三、直接定义结构类型三、直接定义结构类型三、直接定义结构类型三、直接定义结构类型的变量的变量的变量的变量一般形式为:一般形式为:一般形式为:一般形式为:structstruct 成员表列成员表列成员表列成员表列 变量名表列变量名表列变量名表列变量名表列;*不出现结构体名不出现结构体名不出现结构体名不出现结构体名structintnum;charname20;charsex;intage;floatscore;charaddr30;student1,student2;7结构体类型的嵌套结构体类型的嵌套定义:结构体成员又是一个结构体变量定义:结构体成员又是一个
8、结构体变量定义:结构体成员又是一个结构体变量定义:结构体成员又是一个结构体变量例例例例:structdateintmonth;intday;intyear;structdateintmonth;intday;intyear;structstudentstructstudentcharname20;charname20;charsex;charsex;intage;intage;structdatebirthdaystructdatebirthday;stu1,stu2;stu1,stu2;8嵌套结构体变量的引用:嵌套结构体变量的引用:嵌套结构体变量的引用:嵌套结构体变量的引用:点标记法点标记法
9、点标记法点标记法只能对最低成员进行赋值或存取、运算。只能对最低成员进行赋值或存取、运算。只能对最低成员进行赋值或存取、运算。只能对最低成员进行赋值或存取、运算。例:例:例:例:stu1.age=20;stu1.age=20;stu1.dirthday.month=7;stu1.dirthday.month=7;stu1.dirthday.day=31;stu1.dirthday.day=31;B思考以下的引用思考以下的引用思考以下的引用思考以下的引用 printf(“%d%d%d”,stu1.birthday);(printf(“%d%d%d”,stu1.birthday);()stu1.bi
10、rthday=12,31,1988;(stu1.birthday=12,31,1988;()97.2.2结构体变量的引用及初始化结构体变量的引用及初始化不能不能不能不能将一个结构体变量作为将一个结构体变量作为将一个结构体变量作为将一个结构体变量作为一个整体一个整体一个整体一个整体进行输入和输进行输入和输进行输入和输进行输入和输出,只能对出,只能对出,只能对出,只能对各个成员分别输入输出各个成员分别输入输出各个成员分别输入输出各个成员分别输入输出例如:例如:例如:例如:printf(”%d,%s,%c,%d,%f,%sn”,student1);(printf(”%d,%s,%c,%d,%f,%s
11、n”,student1);()引用:引用:引用:引用:student1.num=102;(student1.num=102;()成员的引用方式为:成员的引用方式为:成员的引用方式为:成员的引用方式为:结构体变量名结构体变量名结构体变量名结构体变量名.成员名成员名成员名成员名 注意:注意:注意:注意:成员运算符成员运算符成员运算符成员运算符.在所有运算符中优先级在所有运算符中优先级在所有运算符中优先级在所有运算符中优先级最高最高最高最高10一、结构体变量引用方法一、结构体变量引用方法structclockstructclockinthour,minute,second;inthour,minut
12、e,second;structdatestructdateintyear,month,day;intyear,month,day;structclocktime;structclocktime;today,nextdaytoday,nextday;1.1.单独引用结构体变量的成员单独引用结构体变量的成员单独引用结构体变量的成员单独引用结构体变量的成员today.year=2004;today.year=2004;today.time.second=15;today.time.second=15;2.2.结构体变量作为一个整体引用结构体变量作为一个整体引用结构体变量作为一个整体引用结构体变量作为
13、一个整体引用 nextday=today;nextday=today;11二、结构体变量的初始化二、结构体变量的初始化定义时初始化:将各元素初值放在定义时初始化:将各元素初值放在“”里赋值给变量。里赋值给变量。例:例:structstudentcharname20;charsex;intage;floatscore;stu1,stu2=“Wangwu”,m,20,88.5;127.3结构体数组结构体数组结构体数组变量的定义结构体数组变量的定义结构体数组变量的定义结构体数组变量的定义 与结构体变量定义类似,只是结构体变量名与结构体变量定义类似,只是结构体变量名与结构体变量定义类似,只是结构体变量
14、名与结构体变量定义类似,只是结构体变量名现为结构体数组变量名现为结构体数组变量名现为结构体数组变量名现为结构体数组变量名如:如:structstudentstructstudentintnum;intnum;charname20;charname20;charsex;charsex;intage;intage;floatscore;floatscore;stu30;stu30;13数组各元素在内存中数组各元素在内存中数组各元素在内存中数组各元素在内存中连续存放,如右图所连续存放,如右图所连续存放,如右图所连续存放,如右图所示。示。示。示。stu0stu0stu1stu1stu2stu21011
15、01“WGJ”WGJ”MM282888.588.5“CS”“CS”102102“DYH”DYH”FF262688.088.0“CS”CS”103103“DYC”DYC”MM242478.578.5“CS”CS”14结构体数组的初始化与引用结构体数组的初始化与引用初始化:数组初始化:数组初始化:数组初始化:数组=初值表列初值表列初值表列初值表列;引用:引用:引用:引用:结构体数组分量结构体数组分量结构体数组分量结构体数组分量.结构体成员结构体成员结构体成员结构体成员structstudentstructstudentintnum;intnum;charname20;charname20;char
16、sex;charsex;intage;intage;floatscore;floatscore;charaddr30;charaddr30;stu3=stu3=101,101,”WGJ”,M,28,88.5,“CS”,”WGJ”,M,28,88.5,“CS”,102,”DYH”,F,26,88.0,”CS”,102,”DYH”,F,26,88.0,”CS”,103,”DYC”,M,24,78.5,”CZ”;103,”DYC”,M,24,78.5,”CZ”;15结构体数组程序举例结构体数组程序举例【例【例】计算一个班学生的三门课程的平均计算一个班学生的三门课程的平均成绩,并输出该班学生姓名及平均
17、成绩。成绩,并输出该班学生姓名及平均成绩。16程序:#include#include#defineMAXSIZE100#defineMAXSIZE100structstudentstructstudentcharname16;/*charname16;/*学生姓名学生姓名学生姓名学生姓名*/*/intgrade3,average;/*intgrade3,average;/*三门成绩,平均分三门成绩,平均分三门成绩,平均分三门成绩,平均分*/*/;17voidmain()voidmain()inti,j,num,s;inti,j,num,s;structstudentstuMAXSIZE;str
18、uctstudentstuMAXSIZE;printf(Enternumberofstudents:);printf(Enternumberofstudents:);scanf(%d,&num);scanf(%d,&num);for(i=0;inum;i+)for(i=0;inum;i+)printf(Entername:);printf(Entername:);scanf(%s,stui.name);scanf(%s,stui.name);printf(Enterthegrades(3):);printf(Enterthegrades(3):);for(j=0,s=0;j3;j+)for(j
19、=0,s=0;j3;j+)scanf(%d,&stui.gradej);scanf(%d,&stui.gradej);s=s+stui.gradej;s=s+stui.gradej;stui.average=s/3;stui.average=s/3;for(i=0;inum;i+)for(i=0;i-成员名成员名成员名成员名:pst-num=1001;pst-num=1001;pst-num=1001;pst-num=1001;BB注意注意注意注意:pstpstpstpst不能指向成员:不能指向成员:不能指向成员:不能指向成员:pst=&stu1.numpst=&stu1.numpst=&st
20、u1.numpst=&stu1.num非法非法非法非法;但是但是但是但是:int*q;q=&stu1.numint*q;q=&stu1.numint*q;q=&stu1.numint*q;q=&stu1.num合法合法合法合法20【例【例】用指向结构体变量的指针来访问学用指向结构体变量的指针来访问学生的各项数据。生的各项数据。#includestring.hincludestring.hstructstustructstuintnum;intnum;char*name;char*name;charsex;charsex;floatscore;floatscore;boy=102,Zhangpi
21、ng,M,78.5,*p;boy=102,Zhangping,M,78.5,*p;21voidmain()voidmain()p=&boy;p=&boy;printf(Number=%dnName=%sn,boy.num,boy.name);printf(Number=%dnName=%sn,boy.num,boy.name);printf(Sex=%cnScore=%4.1fnn,boy.sex,boy.score);printf(Sex=%cnScore=%4.1fnn,boy.sex,boy.score);printf(Number=%dnName=%sn,(*p).num,(*p).n
22、ame);printf(Number=%dnName=%sn,(*p).num,(*p).name);printf(Sex=%cnScore=%4.1fnn,(*p).sex,(*p).score);printf(Sex=%cnScore=%4.1fnn,(*p).sex,(*p).score);printf(Number=%dnName=%sn,p-num,p-name);printf(Number=%dnName=%sn,p-num,p-name);printf(Sex=%cnScore=%4.1fnn,p-sex,p-score);printf(Sex=%cnScore=%4.1fnn,
23、p-sex,p-score);22指向结构体数组的指针指向结构体数组的指针 例例例例 输出数组中各元素中各成员的值。输出数组中各元素中各成员的值。输出数组中各元素中各成员的值。输出数组中各元素中各成员的值。structstudentstructstudentintnum;intnum;charname20;charname20;charsex;charsex;intage;intage;structstudentstu3structstudentstu3=10101,Zhang,M,18,=10101,Zhang,M,18,10102,Li,M,19,10102,Li,M,19,10103,W
24、ang,F,20;10103,Wang,F,20;/续续续续stu0stu0P Pstu1stu1PPstu2stu2P”P”1010110101“ZhangZhang”MM18181010210102“Li”Li”MM19191010310103“WangWang”FF202023main()/*main()/*续上页续上页续上页续上页*/*/structstudent*p;structstudent*p;printf(No.NameSexAgen);printf(No.NameSexAgen);for(p=stu;pstu+3;p+)for(p=stu;pnum,p-name,p-num,
25、p-name,p-sex,p-age);p-sex,p-age);stu0stu0P Pstu1stu1PPstu2stu2P”P”1010110101“ZhangZhang”MM18181010210102“Li”Li”MM19191010310103“WangWang”FF202024注意事项注意事项:如果如果如果如果p p的初值为的初值为的初值为的初值为stustu,即指向结构体数组的第即指向结构体数组的第即指向结构体数组的第即指向结构体数组的第1 1个个个个元素元素元素元素stu0stu0,则则则则p+1p+1指向下指向下指向下指向下1 1个元素的起始地址个元素的起始地址个元素的起始地
26、址个元素的起始地址stu1stu1。区别:区别:区别:区别:(+(+p)p)-numnum和和和和(p+)p+)-numnump p已定义为指向已定义为指向已定义为指向已定义为指向structstudentstructstudent类型的指针变量类型的指针变量类型的指针变量类型的指针变量,则则则则p p只能指向只能指向只能指向只能指向1 1个结构体类型数据,而不能指向个结构体类型数据,而不能指向个结构体类型数据,而不能指向个结构体类型数据,而不能指向结构体类型的某一成员(即结构体类型的某一成员(即结构体类型的某一成员(即结构体类型的某一成员(即p p的地址不是成员的地址不是成员的地址不是成员的
27、地址不是成员的地址)。的地址)。的地址)。的地址)。如:如:如:如:p=&stu.namep=&stu.name;(错误错误错误错误)引例:引例:在学校的教师和学生中填写以下表格:在学校的教师和学生中填写以下表格:在学校的教师和学生中填写以下表格:在学校的教师和学生中填写以下表格:姓名姓名姓名姓名年龄年龄年龄年龄职业职业职业职业单位;单位;单位;单位;“职业职业职业职业”一项可一项可一项可一项可分为分为分为分为“教师教师教师教师”和和和和“学生学生学生学生”两类。对两类。对两类。对两类。对“单位单位单位单位”一项学生应填入班级编号,教师应填入某系一项学生应填入班级编号,教师应填入某系一项学生应
28、填入班级编号,教师应填入某系一项学生应填入班级编号,教师应填入某系某教研室。某教研室。某教研室。某教研室。姓名姓名 年龄年龄 职业职业单位单位张宇张宇34教师教师 计算机计算机李南李南20学生学生01 姓名姓名 年龄年龄 职业职业教研室教研室班级班级张宇张宇34教师教师计算机计算机李南李南20学生学生01 7.6共用体共用体26 共用体数据类型,也是将不同数据类型的数共用体数据类型,也是将不同数据类型的数据项,组成一个整体的构造数据类型。据项,组成一个整体的构造数据类型。这种使几个不同的变量共占这种使几个不同的变量共占同一段内存同一段内存的结构,的结构,称为称为“共用体共用体”类型的结构。类型
29、的结构。27一、共用体类型的定义一、共用体类型的定义一、共用体类型的定义一、共用体类型的定义定义一个共用体的一般形式为:定义一个共用体的一般形式为:union共用体名共用体名成员表列成员表列;其中:成员表由若干个成员组成其中:成员表由若干个成员组成,每个成员的形式为:每个成员的形式为:类型说明符类型说明符成员名成员名;成员名的命名应符合标识符的书写规定。例如:成员名的命名应符合标识符的书写规定。例如:unionperdatashortclass;charofficae10;把把unionunion改为改为structstruct就是结构就是结构体的定义形式体的定义形式说明:说明:与结构体声明类
30、似,只需将与结构体声明类似,只需将structstruct换成换成unionunion即可。即可。与结构体一样,声明类型时不分配与结构体一样,声明类型时不分配内存空间,只有在定义其变量时才分配内存空间,只有在定义其变量时才分配内存单元。内存单元。共用体所占内存大小以成员中占据共用体所占内存大小以成员中占据内存空间最多的为准。内存空间最多的为准。unionperdatashortclass;charoffice10;classoffice例例例例:#include#includemain()main()unionperdataunionperdatashortclass;shortclass;c
31、haroffice10;charoffice10;a;a;printf(%d,sizeof(a);printf(%d,sizeof(a);又例又例:#includemain()structperdatashortclass;charoffice10;a;printf(%d,sizeof(a);比较以下两例比较以下两例,分析输出结果分析输出结果:30二、共用体变量、指针的定义二、共用体变量、指针的定义二、共用体变量、指针的定义二、共用体变量、指针的定义定义共用体变量与定义结构体变量相类似,有以下三种方法。定义共用体变量与定义结构体变量相类似,有以下三种方法。1.先定义共用体,再说明共用体变量。先
32、定义共用体,再说明共用体变量。union共用体名共用体名成员表列成员表列;union共用体名共用体名共用体变量表列;共用体变量表列;2.在定义共用体类型的同时说明共用体在定义共用体类型的同时说明共用体变量。变量。union共用体名共用体名成员表列成员表列共用体变量表列;共用体变量表列;3.直接说明共用体变量。直接说明共用体变量。union成员表列成员表列共用体变量表列;共用体变量表列;定义共用体指针与定义结构体指针相定义共用体指针与定义结构体指针相类似。如:类似。如:union共用体名共用体名*共用体指针表列;共用体指针表列;方式一:声明共用体类型:声明共用体类型:uniondatashort
33、i;charch;floatf;;定义共用体变量:定义共用体变量:uniondataa,b,*p,c20;方式二:声明与定义共用体:声明与定义共用体:uniondatashorti;charch;floatf;a,b,*p,c20;方式三:声明与定义共用体:声明与定义共用体:unionshorti;charch;floatf;a,b,*p,c20;声明与定义同时进行时声明与定义同时进行时可以省略共用体名。可以省略共用体名。方式一:声明共用体类型:声明共用体类型:union dataunion datashorti;charch;floatf;;定义共用体变量:定义共用体变量:union dat
34、a union data a,b,*p,c20;方式二:声明与定义共用体:声明与定义共用体:union dataunion datashorti;charch;floatf;a,b,*p,c20;声明与定义同时进行声明与定义同时进行方式三:声明与定义共用体:声明与定义共用体:unionunionshorti;charch;floatf;a,b,*p,c20;声明与定义同时进行时声明与定义同时进行时可以省略共用体名。可以省略共用体名。data32三、共用体变量、指针的引用三、共用体变量、指针的引用 只有定义了共用体变量才能引用它。与结构只有定义了共用体变量才能引用它。与结构体变量,只能引用共用体
35、变量的成员,而不能体变量,只能引用共用体变量的成员,而不能整体引用共用体变量。整体引用共用体变量。共用体变量的引用也有三种方式。共用体变量的引用也有三种方式。方式一:方式一:共用体变量名共用体变量名.成员名成员名 方式二:方式二:共用体指针变量名共用体指针变量名-成员名成员名 方式三:方式三:(*(*共用体指针变量名共用体指针变量名).).成员名成员名33例:若有共用体变量如下定义例:若有共用体变量如下定义union dataunion data int i;int i;char ch;char ch;float f;float f;a,b,*p,c20;a,b,*p,c20;p=&a;p=&
36、a;则可用如下方式引用:则可用如下方式引用:方式一:方式一:a.i a.i,c2.i c2.i,a.ch a.ch;方式二:方式二:p-ip-i,p-ch p-ch 方式三:方式三:(*p).i(*p).i,(*p).ch(*p).ch 注意:注意:不能引用共用体变量,只能引用其成员。不能引用共用体变量,只能引用其成员。如:如:a*5;a*5;是非法的。是非法的。可以用一个共用体变量为另一个共用体变量赋值。可以用一个共用体变量为另一个共用体变量赋值。如:如:b=a;b=a;34四、共用体变量的特点四、共用体变量的特点四、共用体变量的特点四、共用体变量的特点 (1 1)在共用体类型中,同一个内存
37、段可以用来存放几种不)在共用体类型中,同一个内存段可以用来存放几种不同类型的成员,共用体变量所占的内存单元的字节数不是所有同类型的成员,共用体变量所占的内存单元的字节数不是所有成员的字节数之和,而是所有成员中最长字节所占内存空间的成员的字节数之和,而是所有成员中最长字节所占内存空间的字节数。字节数。uniondatashorti;charch;floatf;a;chchi if f例:例:main()uniondatashorti;charch;floatf;a;printf(%dn,sizeof(a);/*a.i=1;a.ch=c;a.f=3.14;printf(%f,a.f);printf
38、(addr_a=%dn,&a);printf(addr_a.i=%dn,&a.i);printf(addr_a.ch=%dn,&a.ch);printf(addr_a.f=%dn,&a.f);*/36 (2 2)系系统统采用采用“覆盖技术覆盖技术”,实现实现共用共用体体变变量各成量各成员员的内存的内存共享共享,在某一在某一时时刻,存放的和起作用的是刻,存放的和起作用的是最后一次存入最后一次存入的成的成员员值值。如执行:如执行:a.i=1;a.ch=a.i=1;a.ch=c c;a.f=3.14;a.f=3.14;执行之后以上语句之后,只有执行之后以上语句之后,只有3.143.14才是有效的成员
39、值。才是有效的成员值。因此特别要注意,当前在共用体中存放的成员值是哪一个。因此特别要注意,当前在共用体中存放的成员值是哪一个。37 (3 3)由于所有成员共享同一内存空间,故由于所有成员共享同一内存空间,故共用体变量共用体变量与其与其各成员各成员的的地址相同地址相同。如:如:&a&a、&a.i&a.i、&a.ch&a.ch、&a.f&a.f都是同一地址值。都是同一地址值。(4 4)不能对共用体变量名用常量不能对共用体变量名用常量赋值赋值,也不能企图引用变,也不能企图引用变量名来得到一个值,定义量名来得到一个值,定义初始化初始化共用体变量只能给出第一个成共用体变量只能给出第一个成员的值。员的值。
40、union dataunion data int i;int i;char ch;char ch;float f;float f;a=2,a=2,c c,3.14;,3.14;a=5;a=5;m=a;m=a;如以下这些都是非法的:如以下这些都是非法的:(5 5)可以用一个共用体变量为另一个共用体变量赋值。可以用一个共用体变量为另一个共用体变量赋值。如:如:b=a;b=a;。union dataunion data int i;int i;char ch;char ch;float f;float f;a=2;a=2;以下是合法的:以下是合法的:38例例例例10.110.1程序程序程序程序voi
41、d main()void main()union exx union exx int a,b;int a,b;structint c,d;lpp;structint c,d;lpp;e=10;e=10;e.b=e.a+20;e.b=e.a+20;e.lpp.c=e.a+e.b;e.lpp.c=e.a+e.b;e.lpp.d=e.a*e.b;e.lpp.d=e.a*e.b;printf(printf(%d,%dn%d,%dn,e.lpp.c,e.lpp.d);,e.lpp.c,e.lpp.d);程序执行的结果为:程序执行的结果为:6060,36003600e.be.be.ae.a10306036
42、0039五、共用体的应用五、共用体的应用五、共用体的应用五、共用体的应用例例1:设有一个教师与学生通用的表格,教师数据有姓:设有一个教师与学生通用的表格,教师数据有姓名,年龄职业,教研室四项。学生有姓名,年龄,职业,名,年龄职业,教研室四项。学生有姓名,年龄,职业,班级四项。编程输入人员数据,班级四项。编程输入人员数据,再以表格输出。再以表格输出。40#include#includevoidmain()voidmain()structstructcharname10;charname10;intage;intage;charjob;charjob;unionunionintclass;intc
43、lass;charoffice10;charoffice10;depa;depa;body10;body10;intn,i;intn,i;for(i=0;i10;i+)printf(inputname,age,jobanddepartmentn);scanf(%s%d%c,bodyi.name,&bodyi.age,&bodyi.job);if(bodyi.job=s)scanf(%d,&bodyi.depa.class);elsescanf(%s,bodyi.depa.office);printf(nametagejobclass/officen);for(i=0;i10;i+)if(bod
44、yi.job=s)printf(%st%3d%3c%dn,bodyi.name,bodyi.age,bodyi.job,bodyi.depa.class);elseprintf(%st%3d%3c%sn,bodyi.name,bodyi.age,bodyi.job,bodyi.depa.office);例例2:分析下面的程序,写出运行结果。:分析下面的程序,写出运行结果。#includestructainta1;inta2;unionbintb1;structab2;voidmain()unionbc;c.b2.a1=2;c.b2.a2=3;c.b1=4;c.b2.a2=c.b2.a1+c.b
45、2.a2;printf(%dn,c.b2.a2);cb2a1a2b1234运行结果运行结果:7位运算与位段结构位运算与位段结构 位是指二进制数的一位,其值为位是指二进制数的一位,其值为0 0或或1 1。位段以位为单位来定义结构体(或共用体)中成员所占存位段以位为单位来定义结构体(或共用体)中成员所占存储空间的长度,含有位段的结构体类型称为位段结构。储空间的长度,含有位段的结构体类型称为位段结构。C C语言和其他高级语言不同,完全支持位运算。语言和其他高级语言不同,完全支持位运算。C C语言可用来语言可用来代替代替汇编语言完成大部分编程工作,位运算汇编语言完成大部分编程工作,位运算便是此目的的体
46、现之一,特别是在计算机用于检测和控制领便是此目的的体现之一,特别是在计算机用于检测和控制领域时需要使用位运算。域时需要使用位运算。1 1 位运算位运算 位运算是对字节或字中的实际二进制位进行检测、设置位运算是对字节或字中的实际二进制位进行检测、设置或移位。或移位。在用位运算符进行数的计算时,数是以补码的形式参加在用位运算符进行数的计算时,数是以补码的形式参加运算的。运算的。(1 1)数的补码表示)数的补码表示 C C语言中,数据占用存储空间的最小单位是字节,一个字语言中,数据占用存储空间的最小单位是字节,一个字节由节由8 8个二机制位组成。个二机制位组成。若干个字节组成一个若干个字节组成一个“
47、字字”(字的位数即字长,反映了(字的位数即字长,反映了计算机并行处理的最大二机制位数),字长越大,数的范围计算机并行处理的最大二机制位数),字长越大,数的范围也越大,精度也越高。也越大,精度也越高。1 10 01 10 01 11 10 00 0最低位最低位最高位最高位补码表示数:补码表示数:正数的补码是它本身;正数的补码是它本身;负数的补码是最高位为负数的补码是最高位为1 1,其余各位(数值位),其余各位(数值位)按位取反,再在最低位加按位取反,再在最低位加1 1。0X0X1|X|+11|X|+10=X0=X X=0 X=0+7+7:00000111 +000000111 +0:000000
48、00 00000000 -7-7:1111100111111001-0-0:00000000 00000000 XX反反=优先级优先级运算符运算符含义含义要求运算对象个数要求运算对象个数结合方向结合方向例子例子结果结果2按位取反按位取反1(单目运算符单目运算符)自右向左自右向左3-45左移左移2(双目运算符双目运算符)自左向右自左向右5右移右移5218&按位与按位与2(双目运算符双目运算符)自左向右自左向右3&519按位异或按位异或2(双目运算符双目运算符)自左向右自左向右 35610|按位或按位或2(双目运算符双目运算符)自左向右自左向右 3|57(2 2)位运算符位运算符1)1)“按按位与
49、位与”运算符运算符&(与与AND)参加运算的两个数据,按二进制进行参加运算的两个数据,按二进制进行“与与”运运算。如果两个相应的二进位都为算。如果两个相应的二进位都为1,则该位的结,则该位的结果值为果值为1,否则为,否则为0。即:即:0&0=0,0&1=0,1&0=0,1&1=1。如:如:2&5=0:2=00000000000000103&5=1:3=0000000000000011(&)5=0000000000000101(&)5=000000000000010100000000000000000000000000000001-3&-5=-7:3=0000000000000011 “按位与按
50、位与”运算的常用来运算的常用来清零或保留某些位上的数字清零或保留某些位上的数字。将整个数如将整个数如x x清零只需要写成清零只需要写成x=x&0 x=x&0即可。即可。如果使数据的某一位或几位清零,只需要找到一个数,如果使数据的某一位或几位清零,只需要找到一个数,满足需要清零的相应位的位置为满足需要清零的相应位的位置为0 0,而其余位置的位为,而其余位置的位为1 1即可。即可。如如0011111100111111的第三位清零,保留其他位上的数字。的第三位清零,保留其他位上的数字。0011111100111111 (&)11111011 (&)11111011 00111011 00111011