c语言9结构体与共用体
- 格式:doc
- 大小:68.50 KB
- 文档页数:8
第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(unsigned n,unsigned size);表示在动态存储区中分配n个长度为size的连续空间,函数返回一个指向分配域起始地址的指针,因此答案D是正确的。
malloc函数的调用形式为:void * malloc(unsigned int size);表示是在内存的动态存储区分配一个长度为size的连续空间,并返回一个指向分配域起始地址的指针,答案B和C中malloc的参数分别为:2*(sizeof(int))和2*2,都是整型数,因此调用形式正确。
答案A中(int *)malloc(sizeof(int))的返回值为一个地址值,将地址的值乘以2是没有意义的。
✧答案:A【例2】若有以下说明和定义:struct test{ int m1; char m2; float m3;union uu{ char u1[5]; int u2[2]; }ua;}myaa;则sizeof(struct test)的值是。
A) 12 B) 16 C) 14 D) 9✧考点:结构体类型和共用体类型所占内存的字节数。
✧分析:sizeof(struct test)的功能是求结构体类型test所占用的内存字节数。
它应该等于结构体每个成员所占的字节数之和。
m1为int型,占2字节,m2为char型,占1字节,m3为float型,占4字节,接下来是一个共用体类型uu,共用体所占的字节数应该等于成员中最长者所占的字节数,u1占5字节,u2占4字节,那么该共用体类型应该占用5字节,所以2+1+4+5=12。
结构体与共用体笔记定义结构体C语言允许用户自己建立由不同类型数据组成的组合型的数据结构,它称为结构体(structre)。
在其他一些高级语言中称为“记录”.定义后的结构体类型和系统提供的标准类型(如int, char, float, double 等)具有相似的作用,都可以用来定义变量,只不过int等类型是系统已声明的,而结构体类型是由用户根据需要在程序中指定的。
定义一个结构体类型的一般形式为:struct 结构体名{ 成员表列};注意:1.结构体类型的名字是由一个关键字struct和结构体名组合而成的(例如struct Student) ,结构体名是由用户指定的,又称“结构体标记”,以区别于其他结构体类型。
上面的结构体声明中Student就是结构体名(结构体标记)。
2.花括号内是该结构体所包括的子项,称为结构体的成员。
“成员表列"(member list)也称为“域表”(field list),成员表列由若干个成员组成,每一个成员是结构体中的一个域。
对每个成员也必须作类型说明,其形式为:类型说明符成员名;成员名的命名应符合标识符的书写规定。
例如:struct stu{int num;char name[20];char sex;float score;};3.一个结构体的成员可以属于另一个结构体类型(嵌套)。
例如:struct Date //声明一个结构体类型struct Date{ int month;//月int day;//日int year;//年}struct Student//声明一个结构体类型struct Student{ int num;char name[20];char sex;int age;struct Date birthday;//成员birthday属于struct Date 类型char addr[30];};结构体类型变量1.定义结构体类型变量说明结构变量有以下三种方法。
一、结构体(structure)
C语言允许用户自己指定这样一种数据结构,即将不同类型的数据组合成一个有机的整体以便于引用。
二、共用体
使几个不同的变量共占同一段内存的结构。
三、枚举类型
1、如果一个变量只有几种可能的值,可以用此方法定义。
2、声明枚举类型用enum开头。
3、说明:(1)在C编译中,对枚举元素按常量处理;
(2)C语言编译按定义时的顺序使它们的值为0,1,2…,也可以改变枚举元素的值,在定义时由程序员指定;
(3)枚举值可以用来作判断比较;
(4)一个整数不能直接赋给一个枚举元素,只有进行强制类型转换才能赋值:workday=(enum weekday)2;
四、用typedef定义类型。
第9章结构体与共用体一、单项选择题1. 若有以下说明语句:struct student{ int num;char name[ ];float score;}stu;则下面的叙述不正确的是: ( )A) struct是结构体类型的关键字B) struct student 是用户定义的结构体类型C) num, score都是结构体成员名D) stu是用户定义的结构体类型名2. 若有以下说明语句:struct date{ int year;int month;int day;}brithday;则下面的叙述不正确的是_____.A) struct是声明结构体类型时用的关键字B) struct date 是用户定义的结构体类型名C) brithday是用户定义的结构体类型名D) year,day 都是结构体成员名3. 已知:(设整型2字节,字符型1字节,浮点型4字节)struct{ int i;char c;float a;}test;则sizeof(test)的值是。
A) 4 B) 5 C) 6 D) 74. 以下对结构变量stul中成员age的非法引用是。
struct student{ int age;int num;}stu1,*p;p=&stu1;A) stu1.age B) student.age C) p->age D) (*p).age5. 有如下定义struct person{char name[9]; int age;};struct person class[10]={“Tom”,17,“John”,19,“Susan”,18,“Adam”,16,};根据上述定义,能输出字母A的语句是A) printf(“%c\n”,class[3].name); B) printf(“%c\n”,class[3].name[0]);C) print f(“%c\n”,class[3].name[1]); D) printf(“%c\n”,class[2].name[3]);6. 存放100个学生的数据、包括学号、姓名、成绩。
九、结构体与共用体(一) 选择题1、C语言结构体类型变量在程序执行期间_________。
A.所有成员一直驻留在内存中B.只有一个成员驻留在内存中C.部分成员驻留在内存中D.没有成员驻留在内存中2、下面程序的运行结果是_________。
main(){struct cmplx{ int x;int y;}cnum[2]={1,3,2,7};printf("%d\n",cnum[0].y/cnum[0].x*cnum[1].x);}A.0 B.1 C.3 D.63、设有如下定义:struct sk{int n;float x;}data ,*p;若要使p指向data中的n域,正确的赋值语句是_________。
A.p=&data.n;B.*p=data.n;C.p=(struct sk *)&data.n;D.p=(struct sk *)data.n4、以下对结构体变量stu1中成员age的非法引用是_________。
struct student{int age;int num;}stu1,*p;p=&stu1;A.stu1.ageB.student.ageC.p->ageD.(*p).age5、下面对typedef的叙述中不正确的是_________。
A.用typedef可以定义各种类型名,但不能用来定义变量B.用typedef可以增加新类型C.用typedef只是将已存在的类型用一个新的标识符来代表D.使用typedef有利于程序的通用和移植6、以下scanf函数调用语句中对结构体变量成员的不正确引用是_________。
struct pupil{char name[20];int age;int sex;}pup[5],*p;p=pup;A.scanf("%s",pup[0].name);B.scanf("%d",&pup[0].age);C.scanf("%d",&(p->sex));D.scanf("%d",p->age);7、若有以下说明和定义union dt{int a;char b;double c;}data;以下叙述中错误的是_________。
A)data的每个成员起始地址都相同B)变量data所占的内存字节数与成员c所占字节数相等C)程序段:data.a=5;printf("%f\n",data.c);输出结果为5.000000D)data可以作为函数的实参8、有一下语句struct s { int i1; struct s,*i2};static struct s a[3]={1,&a[1],2,&a[2],3,&a[3]},*ptr;ptr=&a[1];则一下表达式结果为3的是_________.A.ptr->i1++B. ptr++->i1C.*ptr->i1D. ++ptr->i19、C语言结构体类型变量在程序执行期间_________。
A.所有成员一只驻留在内存中B.只有一个成员驻留在内存中C.部分成员驻留在内存中D.没有成员驻留在内存中10、若定义了如下共用体变量x,则x所占用的内存字节数为_________。
union data{int i;char ch;double f;}x;A.7B.11C. 8D. 1011、在下面的叙述中,不正确的是_________。
A.枚举变量只能取对应枚举类型的枚举元素表中的元素。
B.可以在定义枚举类型时对枚举元素进行初始化。
C.枚举元素表中的元素有先后次序,可以进行比较。
D.枚举元素的值可以是整数或字符串。
12、设有类型说明"enum color {red,yellow=4,white,black};",则执行语句"printf("%d",white);"后的输出是_________。
A.5B.2C.1D.013、设有说明:struct{char name[15],sex;int age;float score;}stu,*p=&stu;以下不能正确输入结构体成员值的是_________。
A.scanf("%c",&p->sex);B.scanf("%s",);C.scanf("%d",&stu.age);D.scanf("%f",p->score);14、设有说明:union data{int i;float f;struct{int x;char y;}s;double d;}a;在16位PC环境下,int类型的整数占用两个字节,则变量a在内存中所占字节数为_________。
A.8B.17C.9D.1515、设有说明:struct {int x,y;}s[2]={{1,2},{3,4}}, *p=s,*q=s;则表达式++p->x和表达式(++q)->x的值分别为_________。
A.1 1B.1 3C.2 3D.3 316、以下说法中正确的是_________。
A.一个结构只能包含一种数据类型B.不同结构中的成员不能有相同的成员名C.两个结构变量不可以进行比较D.关键字typedef用于定义新的数据类型17、设有以下说明语句,则值为210的表达式是_________。
struct s{int a;int *b;};int x0[]={110,120},x1[]={210,220};struct s x[]={{100},{200}},*p=x;x[0].b=x0;x[1].b=x1;A.*p->bB.(++p)->aC.*(p++)->bD.*(++p)->b18、当说明一个结构体变量时,系统分配给它的内存是_________。
A.各成员所需内存量的总和。
B.结构体中第一个成员所需内存量。
C.成员中占内存量最大者所需的容量。
D.结构体中最后一个成员所需内存量。
19、把一些属于不同类型的数据作为一个整体来处理时,常用_________。
A. 简单变量B.数组类型数据C. 指针类型数据D. 结构体类型数据20、在说明一个联合体变量时,系统分配给它的存储空间是_________。
A.该联合体中第一个成员所需存储空间。
B.该联合体中占用最大存储空间的成员所需存储空间。
C.该联合体中最后一个成员所需存储空间。
D.该联合体中所有成员所需存储空间的总和。
21、在下面的叙述中,不正确的是_________。
A.枚举变量只能取对应枚举类型的枚举元素表中的元素。
B.可以在定义枚举类型时对枚举元素进行初始化。
C.枚举元素表中的元素有先后次序,可以进行比较。
D.枚举元素的值可以是整数或字符串。
22、下面程序的输出结果是_________。
main(){struct cmplx{int x;int y;}cnum[2]={1,3,2,7};printf(“%d\n”,cnum[0].y/cnum[0].x*cnum[1].x);} A.0 B.3C.1D.623、若有如下说明:struct xx{int a;int b;};则_________是正确的应用或定义。
A.xx.a=5B.xx c;c.x=5C.struct c;c.x=5D.struct xx c={5}24、下面程序的输出结果是_________。
main(){struct cmplx{int x;int y;}cnum[2]={1,3,2,7};printf(“%d\n”,cnum[0].y/cnum[0].x*cnum[1].x);} A.0 B.3C.1D.6(二)填空题1、以下程序的运行结果是_________.struct n{int x;char c;};main(){struct n a={10,'x'};func(a);printf("%d,%c",a.x,a.c);}func(struct n b){b.x=20;b.c='y';}2、若有定义:struct num{int a;int b;float f;}n={1,3,5.0};struct num *pn=&n;则表达式pn->b/n.a*++pn->b的值是_________,表达式(*pn).a+pn->f的值是_________ 3、以下程序的运行结果是_________.struct ks{int a;int *b;}s[4],*p;main(){int n=1;printf("\n");for(i=0;i<4;i++){s[i].a=n;s[i].b=&s[i].a;n=n+2;}p=&s[0];p++;printf("%d,%d\n",(++p)->a,(p++)->a);}4、结构数组中存有三人的姓名和年龄,以下程序输出三人中最年长者的姓名和年龄。
请在_________内填入正确内容。
stati struct man{char name[20];int age;}person[]={"li=ming",18,"wang-hua",19,"zhang-ping",20};main(){struct man *p,*q;int old=0p=person;for( ;p_________;p++)if(old<p->age){q=p; _________;}printf("%s %d",_________);}5、以下程序段的功能是统计链表中结点的个数,其中first为指向第一个结点的指针(链表不带头结点)。
请在_________内填入正确内容。
struct link{char data ;struct link *next;};....struct link *p,*first;int c=0;p=first;while(_________){_________;p=_________;}6、以下程序运行后的输出结果是_________ 。
struct NODE{int k;struct NODE *link;};main(){ struct NODE m[5],*p=m,*q=m+4;int i=0;while(p!=q){p->k=++i;p++;q->k=i++;q--;}q->k=i;for(i=0;i<5;i++)printf("%d",m[i].k);printf("\n");}7、下面的程序输入学生的姓名和成绩,然后输出,请填空。