C语言各章节单元测试题及答案-结构体与共用体_第1页
C语言各章节单元测试题及答案-结构体与共用体_第2页
C语言各章节单元测试题及答案-结构体与共用体_第3页
C语言各章节单元测试题及答案-结构体与共用体_第4页
C语言各章节单元测试题及答案-结构体与共用体_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

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

文档简介

第9章结构体与共用体9.1典型考试题剖析9.1.1选择题【例1】若指针p已经正确定义,要使p指向两个连续的整型动态存储单元,不正确的语句是。A)p=2*(int*)malloc(sizeof(int));B)p=(int*)malloc(2*sizeof(int));C)p=(int*)malloc(2*2);D)p=(int*)calloc(2,sizeof(int));

考点:动态存储分配函数。

分析:根据动态存储分配函数malloc和calloc的函数原型可以知道,calloc函数的调用形式为:void*calloc(unsignedn,unsignedsize);表示在动态存储区中分配n个长度为size的连续空间,函数返回一个指向分配域起始地址的指针,因此答案D是正确的。malloc函数的调用形式为:void*malloc(unsignedintsize);表示是在内存的动态存储区分配一个长度为size的连续空间,并返回一个指向分配域起始地址的指针,答案B和C中malloc的参数分别为:2*(sizeof(int))和2*2,都是整型数,因此调用形式正确。答案A中(int*)malloc(sizeof(int))的返回值为一个地址值,将地址的值乘以2是没有意义的。

答案:A【例2】若有以下说明和定义:structtest{intm1;charm2;floatm3;unionuu{charu1[5];intu2[2];}ua;}myaa;则sizeof(structtest)的值是。A)12B)16C)14D)9

考点:结构体类型和共用体类型所占内存的字节数。

分析:sizeof(structtest)的功能是求结构体类型test所占用的内存字节数。它应该等于结构体每个成员所占的字节数之和。m1为int型,占2字节,m2为char型,占1字节,m3为float型,占4字节,接下来是一个共用体类型uu,共用体所占的字节数应该等于成员中最长者所占的字节数,u1占5字节,u2占4字节,那么该共用体类型应该占用5字节,所以2+1+4+5=12。

答案:A【例3】若有以下定义:structlink{intdata;structlink*next;}a,b,c,*p,*q;且变量a和b之间已经有如右图所示的链表结构:指针p指向变量a,q指向变量c。能够把c插到a和b之间,并形成新的链表的语句组是。A)a.next=c;c.next=b;B)p.next=q;q.next=p.next;C)p->next=&c;q->next=p->next;D)(*p).next=q;(*q).next=&b;

考点:向链表插入结点。

分析:答案A中,a.next是一个指针变量,而c是一个结构体变量,二者不能互相赋值。答案B错误在于p和q都是指针变量,引用时只有p->next或(*p).next两种形式才是正确的。答案C中的第一句将变量a的next指针指向了变量c,但是第二句却没有将c的next指针指向b,而是指向c本身。答案D是先把结构体变量a的next指针指向c,再使c的next指针指向b。

答案:D【例4】设有以下说明语句:typedefstruct{intn;charch[8];}per;则下面叙述正确的是。A)per是结构体变量名B)per是结构体类型名C)typedef是结构体类型D)struct是结构体类型名

考点:用typedef定义新类型。

分析:根据概念,typedef的作用是声明新的类型名来代替已有的类型名,因此只有答案B是正确的。

答案:B【例5】有以下程序:structstu{char[10];floatscore[3];};main(){structstus[3]={{"20021",90,95,85},{"20022",95,80,75},{"20023",100,95,90}},*p=s;inti;floatsum=0;for(i=0;i<3;i++)sum=sum+p->score[i];printf("%6.2f\n",sum);}程序运行后的输出结果是。A)260.00B)270.00C)280.00D)285.00

考点:结构体变量成员的引用。

分析:本题中,s为一个结构体数组,p为结构体指针。语句p=s使p指向数组s的第一个元素即s[0]。for循环的作用是将p所指向的单元累加到变量sum中,作用相当于相当于语句s[0].score[0]+s[0].score[1]+s[0].score[2]。

答案:B【例6】有以下程序#include<stdlib.h>structnode{intnum;structnode*next;};main(){structnode*p,*q,*r;p=(structnode*)malloc(sizeof(structnode));q=(structnode*)malloc(sizeof(structnode));r=(structnode*)malloc(sizeof(structnode));p->num=10;q->num=20;r->num=30;p->next=q;q->next=r;printf("%d\n",p->num+p->next->num);}程序运行后的输出结果是。A)10B)20C)30D)40

考点:指向结构体变量的指针和结构体成员引用。

分析:程序中建立了一个链表,含有三个结点p、q、r,语句p->next=q;q->next=r;将三个结点连接起来,如图所示。

答案:D【例7】下面程序的输出结果为。#include<stdio.h>main(){structst{intx;unsigneda:2;unsignedb:2;}st1,st2;printf("\n%d",sizeof(structst));}A)2.5B)3C)2D)不确定

考点:位段有关知识。

分析:在本例中涉及到位段定义的知识。位段又称位域或位字段,此种定义可以使若干个结构体成员共用一个或几个字节,其中每个成员占用若干二进制位。位段定义和普通结构体定义类似,只是每个成员附加二进制位数说明,如:structstru{unsigneda:2;unsignedb:4;unsigned:0;unsignedd:2;};其中位数为0的无名字段的含义是跳过该字节剩余的位不用,所以上述中stru所占的字节数为2。注意:位域成员通常没有独立的存储单元,因此诸如&st1.a,&st2.b之类对位域成员取地址的运算是非法的。另外,位域成员只能是int或unsigned类型,其它类型都是非法的,而且位域成员也不能排成数组,如:unsignedc[2]:2是错误的。本例中,a和b各占用2个二进制位,不够一个字节,系统将边界调整为整数,加上int型变量x占用的2个字节,共占用3字节。

答案:B【例8】下述程序的执行结果是。#include<stdio.h>unionun{inti;charc[2];};voidmain(){unionunx;x.c[0]=10;x.c[1]=1;printf("\n%d",x.i);}A)266B)11C)265D)138

考点:本例考察的是共用体的特性。

分析:int型变量i和字符数组c共用2个字节的存储单元,通常c[0]位于低字节,c[1]位于高字节。因此,x.i=x.c[1]*256+c[0]=266,正确答案为A。通过本例我们知道,共用体可以实现将一个数据的各个字节拆分出来单独使用。

答案:A【例9】下面程序的输出是。main(){enumteam{my,your=4,his,her=his+10};printf("%d%d%d%d\n",my,your,his,her);}A)0123B)04010C)04515D)14515

考点:枚举类型数据的性质。

分析:枚举类型定义后的枚举元素表中的元素值排列顺序依次为0,1,2…,若其中某一元素给定初值,则其后的元素值依次递增。

答案:C【例10】以下对枚举类型名的定义中正确的是。A)enuma={one,two,three};B)enuma{one=9,two=-1,three};C)enuma={"one","two","three"};D)enuma{"one","two","three"};

考点:枚举类型的定义。

分析:根据枚举类型的定义形式知道,只有答案B的形式是正确的。

答案:B9.1.2填空题【例1】下面程序的运行结果为。typedefunionstudent{charname[10];longsno;charsex;floatscore[4];}stu;main(){stua[5];printf("%d\n",sizeof(a));}

考点:结构体变量所占内存的长度。

分析:本题中a是一个共用体数组,题目最终要求出数组a所占的内存字节数,由于数组a包含5个元素,因此它所占的内存字节数为:每个元素所占的字节数*5。而每个元素都是共用体类型变量,它们的长度等于分量中长度最长的变量,显然score数组占16字节是最长的。因此该题的结果为:16*5=80。

答案:80【例2】以下程序完成链表的输出,请填空。voidprint(head)structstu*head;{structstu*p;p=head;if(【1】)do{printf("%d,%f\n",p->num,p->score);p=p->next;}while(【2】);}

考点:链表操作。

分析:p是指向链表结点的指针变量,输出过程中每输出一个结点的内容之后,就向后移动一个位置,当p指向NULL时输出结束,两处空白处均为判断链表是否结束的语句,其中第一空判断链表是否为空表。

答案:【1】p!=NULL【2】p!=NULL【例3】已知指针变量head指向单链表表头,下面程序用来统计链表中各个结点的数据项之和,请填空。structlink{intdata;structlink*next;};main(){intk;structlink*head;k=sum(head);printf("%d\n",k);}sum(【1】){structlink*p;ints;s=head->data;p=head->next;while(p){s+=【2】;p=p->next;}return(s);}

考点:链表操作。

分析:求和函数sum的形参应该接收实参传过来的单向链表头结点的地址,所以应该为一个指针变量,求和语句应该填入的是用指针变量p引用结构体的数据成员。

答案:【1】structlink*head【2】p->data或(*p).data【例4】下面程序的输出结果是。main(){enumabc{green=3,red};char*clr[]={"red","blue","yellow","black","white","green"};printf("%sand",clr[green]);printf("%s",clr[red]);}

考点:枚举类型数据。

分析:字符型指针数组clr中存放的是6个字符串的首地址,因枚举元素是常量,所以printf语句中的输出项clr[green]、clr[red]就是clr[3]、clr[4]即"black"和"white"的首地址。

答案:blackandwhite9.2自测练习与参考答案9.2.1选择题1.有以下定义和语句:structstudent{intage;intnum;};structstudentstu[3]={{1001,20},{1002,19},{1003,21}};main(){structstudent*p;p=stu;……}则以下不正确的引用是。A)(p++)->numB)p++C)(*p).numD)p=&stu.age2.有以下结构体定义:structexample{intx;inty;}v1;则正确的引用或定义是。A)example.x=10B)examplev2;v2.x=10;C)structv2;v2.x=10;D)structexamplev2={10};3.对于如下结构体定义,若对变量person的出生年份进行赋值,正确的赋值是。structdate{intyear,month,day;};structworklist{charname[20];charsex;structdatebirth;}person;A)year=1976B)birth.year=1976C)person.birth.year=1976D)person.year=19764.根据下述定义,可以输出字符'A'的语句是。structperson{charname[11];struct{charname[11];intage;}other[10];};structpersonman[10]={{"Jone",{"Paul",20}},{"Paul",{"Mary",18}},{"Mary",{"Adam",23}},{"Adam",{"Jone",22}}};A)printf("%c",man[2].other[0].name[0]);B)printf("%c",other[0].name[0]);C)printf("%c",man[2].(*other[0]));D)printf("%c",man[3].name);5.若有以下程序段:structst{intn;structst*next;};structsta[3]={5,&a[1],7,&a[2],9,'\0'},*p=a;则值为6的表达式为。A)p++->nB)p->n++C)(*p).n++D)++p->n6.对于以下定义,不正确的叙述是。uniondata{inti;charc;floatf;}a,b;A)变量a所占的内存长度等于成员f的长度B)变量a的地址和它的各成员地址都是相同的C)不能对变量a赋初值D)可以在定义的时候对a初始化7.下述程序运行结果为。#include<stdio.h>structst{intn;int*m;}*p;voidmain(){intd[5]={10,20,30,40,50};structstarr[5]={100,d,200,d+1,300,d+2,400,d+3,500,d+4};p=arr;printf("%d\t",++p->n);printf("%d\t",(++p)->n);printf("%d\n",++(*p->m));}A)10120021B)1012030C)20010121D)101101108.以下程序的运行结构是。#include<stdio.h>main(){union{longa;intb;charc;}m;printf("%d\n",sizeof(m));}A)2B)4C)6D)79.若要利用下面的程序段使指针变量p指向一个存储整型变量的存储单元,则在空格中应填入的内容是。int*p;p=malloc(sizeof(int));A)intB)int*C)(*int)D)(int*)10.执行下述语句后的结果是。enumweekday{sun,mon=3,tue,wed,thu};enumweekdayday;day=wed;printf("%d\n",day);A)5B)3C)4D)编译时出错9.2.2填空题1.若已定义:structnum{inta;intb;floatf;}n={1,3,5.0};structnum*pn=&n;则表达式pn->b/n.a*++pn->b的值是【1】。表达式(*pn).a+pn->f的值是【2】。2.对于图中所示的存储结构,每个结点含有三个域,front是指向前一个结点的指针域,data是指向字符串的指针域,next是指向下一个结点的指针域,请填空晚成此结构的类型定义和说明。structlink{【1】;char*data;【2】;

温馨提示

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

评论

0/150

提交评论