模块9结构体和其他构造类型电子课件 C语言程序设计案例教程.pptx
模块9 结构体和其他构造类型假设学生成绩表如表7-1所示。编写一个C程序,以结构体数组类型存储表71中学生的信息。循环计算每位学生所有课程的总分成绩,并按总分成绩由大到小排序,打印学生名次、姓名、总分。大致步骤如下。(1)定义学生成绩单结构类型。(2)在程序入口初始化学生成绩并计算每位学生的总分。(3)利用选择法按学生的总分进行排序。(4)循环打印排序后的名次、姓名、总分。如果学生人数很多,输入至内存变量的数据,当程序结束时就丢失了,希望长期保存数据怎么办(参考模块10中的内容)?任务描述模块9 结构体和其他构造类型(1)能够用结构体数据类型表述客观事物。(2)能够定义和赋值结构体数据类型的变量。(3)能够熟练运用结构体数组。(4)能够掌握结构体的基本概念,为数据结构中动态链接的物理存储结构打好基础。(5)培养数据处理的逻辑思维能力。任务目标模块9 结构体和其他构造类型#include#define N 3#define M 6typedef struct studentchar name12;float scoreM,sum;ST;void input(ST s)源代码展示模块9 结构体和其他构造类型int i,j;float total;for(i=0;iN;i+)total=0;printf(请输入第%d位同学的姓名:,i+1);scanf(%s,si.name);printf(请输入该同学%d门课成绩:,M);for(j=0;jM;j+)源代码展示模块9 结构体和其他构造类型scanf(%f,&si.scorej);total+=si.scorej;si.sum=total;void sort(ST s)int i,j,k;源代码展示模块9 结构体和其他构造类型ST t;for(i=0;iN;i+)k=i;for(j=i+1;jsk.sum)k=j;if(i!=k)t=si;si=sk;sk=t;源代码展示模块9 结构体和其他构造类型main()int i;ST stdN;input(std);printf(n原始数据:n);printf(编号 姓 名 总分n);for(i=0;iN;i+)源代码展示模块9 结构体和其他构造类型 printf(%4d%10s%8.1fn,i+1,stdi.name,stdi.sum);sort(std);printf(n排序后:n);printf(名次 姓 名 总分n);for(i=0;iN;i+)printf(%4d%10s%8.1fn,i+1,stdi.name,stdi.sum);源代码展示模块9 结构体和其他构造类型程序运行结果如图9-1所示。运行结果模块9 结构体和其他构造类型本程序定义了一个结构体类型struct student,用typedef命名为ST;函数input用来实现学生信息的输入并计算总分成绩,借助s数组参数传递数据;函数sort完成结构数组的排序,排序中交换数据时,结构体变量直接交换数据(注意临时变量t的类型定义)。在主函数中,调用函数input,输出排序前的结果,再调用sort函数排序,输出排序后的结果。模块6中学习了一种十分有用的数据结构数组,但数组只能用来存放一组相同类型的数据。在实际应用中,一组数据通常是由不同类型的数据组成的。例如,在成绩管理系统中,学生的信息包括学号、姓名、性别、年龄、高等数学、大学英语、计算机文化基础等数据项,各数据项的数据类型不尽相同。为此,C语言提供了结构体数据类型,它可以把多个数据项组合起来,作为一个整体数据进行处理。本模块将依次介绍在C语言中可由用户构造的3种数据类型:结构体(struct)、共用体(union)和用户定义类型(typedef)。程序分析9.1 结构体变量结构体是一种构造类型(自定义类型),除了结构体变量需要定义后才能使用外,结构体类型本身也需要定义。结构体由若干成员组成,每个成员可以是一个基本的数据类型,也可以是一个已经定义的构造类型。9.1.1 结构体类型的定义结构体类型一般由用户根据需要自己定义,定义格式如下。struct 结构体类型名类型名1结构体成员名表1;类型名2结构体成员名表2;类型名n结构体成员名表n;需要说明如下几点。(1)结构体类型的命名应该遵循标识符规定。(2)结构体有若干数据成员,分别属于各自的数据类型,结构体成员名9.1.1 结构体类型的定义同样遵循标识符规定,名字可以与程序中其他变量或标识符同名。(3)使用结构体类型时,“struct 结构体类型名”作为一个整体,表示名字为“结构体类型名”的结构体类型。(4)结构体类型的成员可以是基本数据类型,也可以是其他已经定义的结构体类型,即结构体嵌套。结构体成员的类型不能是正在定义的结构体类型,但可以是正在定义的结构体类型的指针。例如,定义关于学生信息的结构体类型。struct dateint year,month,day;9.1.1 结构体类型的定义struct studentchar num10;char name12;char sex;struct date birthday;char addr30;float score4;上面指定了一个新的结构体类型struct student。struct student是一个类型名,它和系统提供的标准类型(如int等)一样具有相同的地位和作用。9.1.1 结构体类型的定义不要忽略最后的分号。struct student是结构体类型名,struct是关键词,在定义和使用时均不能省略。该结构体类型由6个成员组成,分别属于不同的数据类型,其中成员birthday是struct date类型。9.1.2 结构体变量的定义声明了结构体类型后,还不能使用,因为声明的只是一种数据类型,必须定义变量才能使用。可以用以下3种方式定义结构体的变量。(1)先声明结构体类型再定义变量。例如:struct student/*结构体类型声明*/char num10;char name12;char sex;char addr30;float score4;9.1.2 结构体变量的定义struct student stud1,stud2;/*结构体变量定义*/(2)在声明结构体类型的同时定义变量。例如:struct studentchar num10;char name12;char sex;char addr30;float score4;stud1,stud2;(3)紧跟无名结构体类型声明后直接定义变量。例如:9.1.2 结构体变量的定义struct char num10;char name12;char sex;char addr30;float score4;stud1,stud2;需要注意如下几点。结构体类型、结构体变量是不同的概念。一般先定义一个结构体类型,然后定义变量为该类型的变量。9.1.2 结构体变量的定义赋值、存取或运算只能对结构体变量,不能对结构体类型。结构体类型名只能表示一个结构形式,编译系统并不对它分配内存空间,只对结构体变量分配内存空间。各成员占据连续空间的不同地址,所占内存大小等于各成员所占内存之和。9.1.3结构体变量的初始化和一般的变量一样,结构体变量也可以在定义的同时赋初值。但是变量后面的一组数据应该用“”括起来,其顺序也应该与结构体中的成员顺序保持一致。例如:struct studentchar name12;char sex;float score;char addr30;std=Li xue,F,580.8,Yantai;9.1.4结构体变量的引用在使用结构体时,不仅要对结构体整体进行操作,更多的是要访问结构体中的某个成员。引用结构体变量中成员的格式如下。结构体变量名.成员名例如,std.name表示std变量中的name成员,std.score表示std变量中的score成员。可以对变量的成员赋值。例如:std.score=90.6;但成员若是字符数组则不能用赋值语句,只能用strcpy()来实现。例如:strcpy(std.name,”lili”);需要说明如下几点。(1)如果成员本身又是结构体类型,则要用若干成员运算符,一级一级9.1.4结构体变量的引用地找到最低的一级成员。只能对最低的成员进行赋值或、存取和运算。例如:stud1.birthday.yearstud1.birthday.monthstud1.birthday.day(2)同一种类型的结构体变量之间可以赋值(整体赋值、成员逐个依次赋值)。例如:stud2=stud1;(3)不允许将一个结构体变量整体输入/输出。【例9-1】编写程序,计算某学生的平均分。程序代码如下。9.1.4结构体变量的引用#include#include string.hstruct stuchar num10;float s3;main()float ave;struct stu li;9.1.4结构体变量的引用strcpy(li.num,2018001);li.s0=78;li.s1=92;li.s2=89;ave=(li.s0+li.s1+li.s2)/3;printf(学号 成绩1 成绩2 成绩3 平均分n);printf(%s%8.1f%8.1f%8.1f%8.1fn,li.num,li.s0,li.s1,li.s2,ave);程序运行结果如下。学号成绩1成绩2成绩3平均分201800178.092.089.086.39.2 结构体数组与指针一个结构体变量中可以存放学号、姓名、成绩等信息,如果有10个学生的数据需要处理,显然应该采用数组,这就是结构体数组。结构体数组与之前介绍的数值型数组的不同之处在于每个数组元素都是一个结构体类型的数据,它们又分别包括各个成员项。9.2.1 结构体数组结构体数组是指数组元素的类型为结构体类型的数组。C语言允许使用结构体数组存放一类对象的数据。1.结构体数组的定义定义结构体数组的语法格式如下。struct 结构体类型名 结构体数组名常量表达式例如:struct studentchar name12;char sex;float score;9.2.1 结构体数组char addr30;struct student std3;2.结构体数组的初始化与其他类型的数组一样,对结构体数组可以初始化。例如:struct studentchar name12;char sex;float score;char addr30;9.2.1 结构体数组;struct student std3=WangGang,M,650.0,jinan,SunYan,F,620.8,weihai,PengChao,M,723.0,yantai;3.结构体数组元素的引用引用结构体数组元素的方法如下。结构体数组名下标.成员名若要修改上面结构体数组初始化中std1的score为680.0,则使用语句:std1.score=680.0;【例9-2】编写程序,求3名学生的平均分并输出。9.2.1 结构体数组程序代码如下。#include#include struct stulchar num10;float s3,ave;main()struct stul student3;9.2.1 结构体数组float sum;int i,j;for(i=0;i3;i+)printf(请输入第%d位学生的学号:,i+1);gets(studenti.num);/*输入学号*/sum=0;printf(请输入学号%s的3门课成绩:,studenti.num);for(j=0;j3;j+)scanf(%f,&studenti.sj);/*输入成绩*/9.2.1 结构体数组sum+=studenti.sj;/*结构体类型的成员变量累加*/studenti.ave=sum/3;fflush(stdin);/*清空缓冲区,stdin表示标准输入*/for(i=0;i成员名。(2)(*结构体指针变量名).成员名。“-”称为结构指针运算符,“.”称为成员运算符。若有以下定义和语句:struct keyint count;char word8;struct key a=12,abc,*p=&a;则引用结构变量a中的count域可以使用以下3种等价形式。9.2.2 结构体指针变量(1)a.count。(2)p-count。(3)(*p).count。3.结构体指针变量与数组前面已经介绍过,可以使用指向数组的指针来访问数组元素。同样,对结构体数组也可以使用指针变量来访问结构数组中的元素。【例9-3】用指针访问结构体变量及结构体数组。程序代码如下。#include main()9.2.2 结构体指针变量struct studentchar num10;char name12;char sex;int age;float score;struct student stu3=“201702”,Wang,F,20,483,“201703”,Liu,M,19,503,“201704”,Song,M,19,471.5;9.2.2 结构体指针变量struct student student1=“201701”,Zhang,F,19,496.5,*p,*q;int i;p=&student1;printf(%s,%c,%5.1fn,student1.name,(*p).sex,p-score);/*访问结构体变量*/q=stu;for(i=0;iname,q-sex,q-score);程序运行结果如下。Zhang,F,496.5Wang,F,483.0Liu,M,503.0Song,M,471.59.3函数之间结构体类型的数据传递结构体变量、结构体指针变量都可以像其他数据类型一样作为函数的参数,也可以将函数定义为结构体类型或结构体指针类型(返回值为结构体、结构体指针类型)。9.3.1结构体变量作为实参用结构体变量作为实参时,采取的是值传递方式,将结构体变量所占的内存单元内容全部顺序传递给形参。形参也必须是同类型的结构体变量。在函数调用期间形参也要占用内存单元,这种传递方式在空间和时间上开销较大。另外,由于采用值传递方式,如果在被调函数中改变了形参的值,该值也不会返回主调函数,这往往造成使用上的不便。【例9-4】编写程序,计算某学生的平均成绩,要求调用函数完成并使用结构体变量作为实参。程序代码如下。#include struct student9.3.1结构体变量作为实参char num10;float s3;float ave;void average(struct student s)/*形参为与实参相同类型的结构变量*/s.ave=(s.s0+s.s1+s.s2)/3;printf(%s的平均分是:%.1fn,s.num,s.ave);main()9.3.1结构体变量作为实参struct student stu=2018001,60,75,80;average(stu);/*结构体变量作为实参*/printf(%s的平均分是:%.1fn,stu.num,stu.ave);程序运行结果如下。2018001的平均分是:71.72018001的平均分是:0.0由【例9-4】得出以下结论。(1)当实参是结构体变量时,形参应与实参是相同类型的结构题变量。函数调用时实参各成员的值一一对应传到形参各成员中。(2)分析程序运行结果不难看出,实参和形参之间的数据传递是单向的,9.3.1结构体变量作为实参形参的改变不能影响实参的值。在被调函数average中经过计算后,成员ave原来的值被71.7取代,但该形参的改变不影响实参,所以在主函数中输出实参的ave的值为0.0。9.3.2 结构体变量指针作为实参用指向结构体变量的指针作为实参,将结构体变量的地址传给形参。【例9-5】编写程序,计算某学生的平均成绩,要求调用函数完成并使用结构体变量的地址作为实参。程序代码如下。#include struct studentchar num10;float s3;float ave;9.3.2 结构体变量指针作为实参void average(struct student*p)p-ave=(p-s0+p-s1+p-s2)/3;main()struct student stu=2018001,60,75,80;average(&stu);printf(%s的平均分是:%.1fn,stu.num,stu.ave);程序运行结果如下。9.3.2 结构体变量指针作为实参2018001的平均分是:71.7由【例9-5】得出以下结论。(1)当实参是结构体变量的地址时,形参应与实参是相同类型的结构体指针变量。函数调用时,实参的地址值传给形参中的指针变量。系统只需为形参指针开辟一个存储单元存放实参结构体变量的地址,而不必另建立一个结构体变量。这样可以减少系统操作所需的时间,提高程序的执行效率。(2)在被调函数中可以通过引用形参的指针变量和访问主调函数中的结构体变量,即可以通过函数的调用,有效地修改实参结构体中成员的值。9.3.3 结构体数组作为参数与普通数组一样,结构数组名也可以作为实参,但是因为数组名本身是一个地址值,所以,用结构体数组名作为参数时,实参与形参都应用结构体数组名或结构体指针。【例9-6】编写程序,计算N个学生的平均成绩,要求调用函数完成并使用结构体数组作为实参。程序代码如下。#include#define N 3struct studentchar num10;9.3.3 结构体数组作为参数float s3,ave;void average(struct student p)int i;for(i=0;iN;i+)pi.ave=(pi.s0+pi.s1+pi.s2)/3;main()int i;9.3.3 结构体数组作为参数struct student stuN=201801,60,75,80,201802,85,90,80,201803,88,75,90;average(stu);for(i=0;i”运算符引用共同体类型的成员变量。共同体数据的特点如下。(1)在每个瞬间,共同体变量中只有一个成员起作用,其他成员不起作用。(2)共用体变量中有意义的成员是最后一次存放的成员。例如,在执行“a.i=1;a.f=3.6;a.ch=H”语句后,当前只有a.ch有意义(x.a,x.b也可以访问,但没有实际意义)。(3)与结构体变量不同,共同体变量不能初始化。(4)共同体变量的地址与成员的地址相同,即&a.i=&a.f=&a.ch=&a。9.4.3 共同体成员的引用(5)结构体变量占用空间大小是所有成员占用空间之和,而共同体变量占用的空间大小与各成员中占用空间最大的相同。(6)共用体、结构体可以相互嵌套。【例9-7】学校人员的数据管理。教师的数据包括编号、姓名、性别和职务,学生的数据包括编号、姓名、性别和班号。现将两种数据放在同一个表格中,如图92所示。最后一列,对于教师,登记教师的“职务”,对于学生,则登记学生的“班号”(对于同一人员不可能同时出现)。写出类型定义,并编写输入信息和输出信息的程序代码。程序代码如下。#include#include 9.4.3 共同体成员的引用struct person/*结构体类型定义*/long num;char name20;char sex;char job;/*人员标志:s-学生,t-教师*/union/*匿名共用体定义,并定义共用体变量category作为外层结构体的成员*/char class10;char position20;9.4.3 共同体成员的引用 category;int input(struct person person)/*输入人员信息,返回人员数*/int i;for(i=0;i20;i+)/*循环输入,如果满20个或遇到编号-1结束循环*/printf(num:);scanf(%ld,&personi.num);if(personi.num=-1)break;printf(name:);9.4.3 共同体成员的引用scanf(%s,personi.name);flushall();printf(sex:);scanf(%c,&personi.sex);printf(job(s-student,t-teacher):);scanf(%c,&personi.job);if(toupper(personi.job)=s)/*如果是学生的信息*/printf(class:);scanf(%s,personi.category.class);9.4.3 共同体成员的引用elseprintf(position:);scanf(%s,personi.category.position);return i;/*返回人员的数目*/void output(struct person person,int n)int i;9.4.3 共同体成员的引用printf(numtnametsextjobtcategory:n);/*打印表头*/for(i=0;in;i+)/*循环输出*/if(toupper(personi.job)=s)printf(%ldt%st%ct%ct%sn,personi.num,personi.name,personi.sex,personi.job,personi.category.class);elseprintf(%ldt%st%ct%ct%sn,personi.num,personi.name,personi.sex,personi.job,personi.category.position);9.4.3 共同体成员的引用void main()int n;struct person person20;/*人员情况数组*/n=input(person);/*输入数据*/output(person,n);/*输出数据*/9.5 枚 举 类 型所谓枚举,是指将变量的值一一列举出来,变量的值只限于列举出来的值的范围内,因此,枚举类型是只能取事先定义值的数据类型。9.5.1 枚举类型的定义定义枚举类型的语法格式如下。enum 枚举类型名枚举元素列表;例如:enum weekdaysun,mon,tue,wed,thu,fri,sat;enum是关键字,定义了枚举类型enum weekday,取值范围为sun,mon,sat。9.5.2 枚举变量的定义与赋值枚举变量的定义方法与结构体类似。(1)定义枚举类型的同时定义变量:enum 枚举类型名枚举常量列表枚举变量列表。(2)先定义类型后定义变量:enum 枚举类型名 枚举变量列表。(3)匿名枚举类型:enum 枚举常量列表枚举变量列表。例如:enum weekdaysun,mon,tue,wed,thu,fri,sat;enum weekday week1,week2;定义enum weekday枚举类型的变量week1,week2,其取值范围是9.5.2 枚举变量的定义与赋值sun,mon,sat。可以用枚举常量给枚举变量赋值。例如:week1=wed;week2=fri;关于枚举需要说明以下几点。(1)enum是标识枚举类型的关键字,定义枚举类型时应当用enum开头。(2)枚举元素(枚举常量)由程序设计者自己指定,命名规则同标识符。(3)枚举元素在编译时,按定义时的排列顺序取值0,1,2,。(4)枚举元素是常量,不是变量(看似变量,实为常量),可以将枚举元素赋值给枚举变量,但是不能给枚举常量赋值。在定义枚举类型时可以给这些枚举常量指定整型常数值(未指定值的枚举常量的值是前一个枚举常量9.5.2 枚举变量的定义与赋值的值+1)。例如:enum weekdaysun=7,mon=1,tue,wed,thu,fri,sat;则有sun=7,mon=1,tue=2,wed=3,thu=4,fri=5,sat=6。(5)枚举常量不是字符串。(6)枚举常量一般可以参与整数可以参与的运算,如算术运算、关系运算和赋值运算等。例如,若有“week1=sun;printf(%s,week1);”,若要输出“sun”,可以用语句:“if(week1=sun)printf(“sun”);”来实现。(7)枚举变量不能直接输入和输出。一般借助switch语句,通过直接输入它们对应的整数值,根据判断赋值;或根据枚举元素的值进行判断并以字符串形式输出。9.6 定义类型别名C语言还允许使用关键字typedef由用户自己定义有一定字面含义的新类型名,并用这些类型名说明变量,以提高程序的可读性,简化书写。9.6.1 定义已有类型的别名定义已有类型的别名不是定义新的数据类型,而仅仅是对于已经存在的数据类型名再定义一个新名字,用它代替已存在的数据类型名来进行变量的说明,以便使程序更容易理解和识别,也可以提高移植性。定义新类型的语法格式如下。typedef 类型 类型的别名;这里的“类型”必须是在此语句之前已有定义的类型标识符,可以是任何基本类型、结构或联合类型,也可以是typedef定义的类型名。例如,用户自定义类型INTEGER代替已有类型int,用户自定义类型REAL代替已有类型float。typedef int INTEGER;typedef float REAL;INTEGER m,n;/*等价于“int m,n;”*/REAL a,b;/*等价于“float a,b;”*/9.6.2 定义构造类型的别名定义结构体类型名,再用自定义类型名定义变量。例如:typedef struct char name12;char sex;struct date birthday;float score4STD;STD std,pers3,*p;需要说明如下几点。(1)用typedef只是对已经存在的类型增加一个类型名,而没有创造新9.6.2 定义构造类型的别名的类型。(2)新类型名一般用大写表示,以便区别。(3)用typedef定义数组、指针、结构等类型将带来很大的方便,不仅使程序书写简单,而且使程序意义更为明确,也增强了程序的可读性。(4)当不同源文件中用到同一类型数据时,常用typedef声明一些数据类型,把它们单独放在一个文件中,在需要用到的文件中用“#include”把它们包含进来即可。9.7技 能 训 练结构体和共同体不是系统固有的,它需要用户自己定义。在一个实用程序中,可以有多个各不相同的结构体和共同体类型。灵活使用结构类型可以实现复杂数据的表示与操作,要熟练掌握类型的定义与使用,为后续学习面向对象程序设计打下坚实的基础。【例9-8】输入5位用户的姓名和电话号码,按姓氏的字典顺序排序后,输出用户的姓名和电话号码。程序代码如下。#include#include#define N 5typedef struct 9.7技 能 训 练char name20;char tel20;user;void getdata(user*sp);void sort(user*sp);void outdata(user*sp);main()user spN;getdata(sp);9.7技 能 训 练sort(sp);outdata(sp);void getdata(user*sp)int i;printf(Please input name&phone:n);for(i=0;iN;i+)gets(spi.name);gets(spi.tel);9.7技 能 训 练void sort(user*sp)int i,j,k;user temp;for(i=0;iN-1;i+)k=i;for(j=i+1;j0)k=j;9.7技 能 训 练temp=spk;spk=spi;spi=temp;void outdata(user*sp)int i;printf(after sorted:n);for(i=0;iage。等级考试重点及真题解析二、真题解析1.设有如下枚举类型定义:enum language Basic=3,Assembly,Ada=100,COBOL,FORTRAN;枚举量Fortran的值为()。2017年9月A.4B.7C.102D.103 在定义枚举类型时可以给枚举常量指定整型常数值,未指定值的枚举常量的值是前一个枚举常量的值+1,因为Ada=100,所以FORTRAN=102,答案为C。2.下面程序的输出结果为()。2017年9月struct st等级考试重点及真题解析int x;int*y;*p;int dt4=10,20,30,40;struct st aa4=50,&dt0,60,&dt1,70,&dt2,80,&dt3;main()p=aa;printf(%dn,+p-x);printf(%dn,(+p)-x);等级考试重点及真题解析printf(%dn,+(*p-y);A.10B.50C.51D.6020606070202121 31 执行p=aa,使结构指针指向结构数组aa,即指向aa0的地址,aa0.x=50,aa0.y=&dt0,第一个输出+p-x的值,输出的是51,注意运算符“-”的优先级高于“+”;第二个输出(+p)-x的值,因为+p加了括号,所以先将p指针下移,即指向aa1,再取其中x的值60;第三个输出+(*p-y)的值,此时*p-y=*(&dt1)=20,再加1即21。所以答案为C。等级考试重点及真题解析3.设有以下语句:struct st int n;struct st*next;static struct st a3=5,&a1,7,&a2,9,0,*p;p=&a0;则表达式()的值是6。2017年4月A.p+-nB.p-n+C.(*p).n+D.+p-n 因为p=&a0,表达式p+-n的值为5,表达式p-n+的值为5,表达式(*p).n+的值为5,表达式+p-n的值为6。所以答案为D。4.根据下面的定义,能打印出字母M的语句是()。2016年9月A.printf(%cn,class3.name);B.printf(%cn,class3.name1);等级考试重点及真题解析C.printf(%cn,class2.name1);D.printf(%cn,class2.name0);struct person char name9;int age;struct person class10=John,17,Paul,19,Mary,18,Adam,16;因为class2.name=Mary,class3.name=Adam,则有class2.name0=M,class3.name1=d,class2.name1=a,所以答案为D。5.下面程序的输出是()。2016年9月A.0B.1 C.3D.6main()等级考试重点及真题解析 struct cmplx int x;int y;cnum2=1,3,2,7;printf(%dn,cnum0.y/cnum0.x*cnum1.x);cnum0.y/cnum0.x*cnum1.x=3/1*2=6,答案为D。6.若程序中有下面的说明和定义:struct abcint x;char y;struct abc s1,s2;则会发生的情况是()。2015年9月A.编译出错B.程序将顺利编译连接执行C.能顺利通过编译连接但不能执行等级考试重点及真题解析D.能顺利通过编译但连接出错 定义struct abc最后漏掉分号,所以答案为A。7.有以下程序:#include struct stuint num;char name10;int age;void fun(struct stu*p)等级考试重点及真题解析 printf(%sn,(*p).name);main()struct stu students3=9801,Zhang,20,9802,Wang,19,9803,Zhao,18;fun(students+2);输出结果是()。2014年9月A.ZhangB.ZhaoC.WangD.18 执行fun(students+2),将p指针指向students2,输出Zhao,答案等级考试重点及真题解析为B。8.设有以下说明和定义:typedef union long i;int k5;char c;DATE;struct date int cat;DATE cow;double dog;too;DATE max;则下列语句的执行结果是()。2014年9月 printf(%d,sizeof(struct date)+sizeof(max);A.26B.30 C.18D.8 结构体变量占用空间大小是所有成员占用空间之和,而共同体变量占用的空间大小与各成员中占用空间最大的相同。sizeof(struct date)+sizeof(max)=(2+10+8)+10=30,答案为B。等级考试重点及真题解析9.以下选项中,能定义s为合法的结构体变量的是()。2013年9月A.typedef struct abcB.structdouble a;double a;char b10;char b10;s;s;C.struct ABCD.typedef ABC double a;double a;char b10;char b10;ABC s;ABC s;选项A是为结构体类型struct abc命名为新的名字s;选项C定义结构体等级考试重点及真题解析struct ABC错误,漏掉分号,并且定义变量必须写成struct ABC s;选项D命名结构体新名时错误;只有选项B正确,紧跟无名结构体类型声明后直接定义变量。答案为B。10.以下程序运行后的输出结果是()。2011年3月#include#include main()char*p;int i;p=(char*)malloc(sizeof(char)*20);strcpy(p,welcome);等级考试重点及真题解析for(i=6;i=0;i-)putchar(*(p+i);printf(n);free(p);程序中定义了指针变量p,并用malloc函数给p分配了存储空间,调用函数strcpy将指针p指向字符串“welcome”,然后用for循环逆序输出字符串,最后释放p的空间。答案为emoclew。一、选择题1.若有以下定义,变量a所占内存字节数是()。思考与练习思考与练习union udatachar str4;int i;long x;struct sdataint c;union udata u;a;A.4B.5C.6D.82.设有如下定义。struct sk int a;float b;data,*p;若有p=&data;,则对data中的a域的正确引用是()。A.(*p).data.aB.(*p).aC.p-data.aD.p.data.a思考与练习3.有以下说明和定义语句。struct student int age;char num8;struct student stu3=20,201801,21,201802,19,201803;struct student*p=stu;以下选项中引用结构体变量成员的表达式错误的是()。A.(p+)-numB.p-numC.(*p).numD.stu3.age思考与练习4.设有定义“struct char mark12;int num1;double num2;t1,t2;”,若变量均已正确赋初值,则以下语句中错误的是()。A.t1=t2;B.t2.num1=t1.num1;C.t2.mark=t1.mark;D.t2.num2=t1.num2;5.以下定义枚举正确的语句是()。A.enum colorred,white,blue;B.enum color=red=1;white;blue;C.enum colorred,white,blue;D.enum colorred;white;blue;6.若有以下定义。typetef int*INTEGER;思考与练习INTEGER p,*q;以下说法正确的是()。A