C语言程序设计题库 第八章:结构体、共用体和枚举类型

一、单选题

1、如果定义以下结构体类型

struct  s 
{  short  a; 
   char  b; 
   float  f; 
}; 

则理论上来说sizeof(struct s)结果为________。
A、3
B、7
C、6
D、4

解析:答案选B
结构体类型是将具有相互联系的一组数据项组成一个有机的整体。一个结构体类型的变量在内存所占的存储空间是各成员之和。本题在概念上计算结果为7,在不同的编译环境下实际分配的空间可能会有所不同。

2、下面结构体的定义语句中,错误的是________。
A、struct ord { int x; int y; int z; } struct ord a;
B、struct { int x; int y; int z; } a;
C、struct ord { int x; int y; int z; } a;
D、struct ord { int x; int y; int z; };struct ord a;

解析:答案选A
B和C选项都是在定义结构体类型的同时定义结构体变量,其中B选项缺省结构体名,均正确。
D选项在结构体定义完毕,再定义结构体变量,也正确。A选项中的第2个struct ord多余。

3、设有定义struct {char mark[12]; int num1; double num2;} t1,t2;若变量均已正确赋初值,则以下语句中错误的是________。
A、t1=t2;
B、t2.num1=t1.num1;
C、t2.mark=t1.mark;
D、t2.num2=t1.num2;

解析:答案选C
结构体变量成员的引用形式:结构体变量名.成员名。结构体变量各成员进行何种运算,由其数据类型决定。相同结构体类型的结构体变量可以直接相互赋值。
A、t1,t2是相同类型的结构体变量,可以相互赋值。选项A正确。
B、C成员num1和num2为int型量,也可以做相互赋值操作。选项B和D均正确。
D、数据成员mark是字符数组,只能使用库函数strcpy实现赋值,正确应为strcpy(t2.mark,t1.mark)。选项C错误。

4、当定义一个结构体变量时,系统为它分配的内存空间是_______。
A、结构体中一个成员所需的内存容量
B、结构体中第一个成员所需的内存容量
C、结构体成员中占用内存容量最大者所需的容量
D、结构体中各成员所需内存容量之和

解析:答案选D
目前我们只需要理解为:当定义了结构型变量时,需要给其分配内存,分配内存的字节数等于该结构型所有成员占用的字节数之和。 因此,当定义一个结构体变量时系统分配给它的内存是各成员所需内存量的总和。选项D正确。

5、有以下定义struct data { int i; char c; double d; } x;以下叙述中错误的是________。
A、x的内存地址与x.i的内存地址相同
B、struct data 是一个类型名
C、初始化时,可以对x的所有成员同时赋初值
D、成员i、c和d占用的是同一个存储空间

解析:答案选D
A、结构体第一个成员的地址就是结构体的首地址。选项A正确。
B、struct data 是一个类型名。选项B正确。
C、初始化时,可以对x的所有成员同时赋初值。选项C正确。
D、成员i、c和d占用的不是同一个存储空间,是各自分配空间。选项D错误。

6、以下程序的运行结果是________。

#include <stdio.h>
struct S{ int n; int a[20];};
void f(int a[],int n)
{  int i;
   for(i=0;i<n-1;i++)
      a[i]+=i;
}
int main( )
{  int i;
   struct S s={10,{2,3,1,6,8,7,5,4,10,9}};
   f(s.a,s.n);
   for(i=0; i<s.n; i++)
      printf ("%d,",s.a[i]);
return 0;
}

A、2,4,3,9,12,12,11,11,18,9,
B、3,4,2,7,9,8,6,5,11,10,
C、2,3,1,6,8,7,5,4,10,9
D、1,2,3,6,8,7,5,4,10,9,

解析:答案选A
代码思路:改变结构体变量中的数组元素大小,f()函数功能:数组中前8个元素的值增加下标值的大小例如:改变前:a[0]=2,改变后:a[0]=2+0=2,因此a[1]=3+1=4,a[2]=2+1=3,a[3]=3+6=9,a[4]=4+8=12,a[5]=5+7=12,a[6]=6+5=11,a[7]=7+4=11,a[8]=8+10=18,a[9]的值不变a[9]=9。
程序运行截图:
在这里插入图片描述
7、以下程序的运行结果是________。

#include <stdio.h>
struct STU
{  char name[9];
   char sex;
   int s[2];
};
void f(struct STU a[])
{  struct STU b={"Zhao",'m',85,90};
   a[1]=b;
}
int main()
{  struct STU c[2]={{"Qian",'f',95,92},{"Sun",'m',98,99}};
   f(c);
   printf("%s,%c,%d,%d,",c[0].name,c[0].sex,c[0].s[0],c[0].s[1]);
   printf("%s,%c,%d,%d\n",c[1].name,c[1].sex,c[1].s[0],c[1].s[1]);
return 0;
}

A、Zhao,m,85,90,Sun,m,98,99
B、Zhao,m,85,90,Qian,f,95,92
C、Qian,f,95,92,Sun,m,98,99
D、Qian,f,95,92,Zhao,m,85,90

解析:答案选D
代码思路:函数传址调用,改变了结构体数组中的第二个元素a[1]的所有成员变量,因此最后打印两个结构体数组变量的时候,第一个是正常打印,第二个打印的是赋值之后的内容,也就是Zhao,m,85,90。
程序运行结果

在这里插入图片描述

8、以下程序的运行结果是________。

#include <stdio.h>
struct S { int a,b; } data[2]={10,100,20,200};
int main( )
{  struct S p=data[1];
   printf("%d\n",++(p.a) );
   return 0;
}

A、10
B、11
C、21
D、20

解析:答案选C
代码思路:定义了一个结构体数组,元素分别为data[0]={10,100},data[1]={20,200},将data[1]的值赋值给结构体p,然后在打印前执行++(p.a),也就是p结构体变量的a成员20自增1,结果为21。
程序运行结果:
在这里插入图片描述
9、以下程序的运行结果是________。

#include <stdio.h>
struct ord{  int x, y;  } dt[2]={1,2,3,4};
int main( )
{  printf("%d,",++(dt[0].x));
   printf("%d\n",++(dt[1].y));
   return 0;
}

A、2,5
B、4,1
C、3,4
D、1,2

解析:答案选A
**代码思路:**定义了一个结构体数组,元素分别为dt[0]={1,2},dt[1]={3,4},第一步打印:先访问dt[0].x,然后自增1,也就是打印2;第二步打印:先访问dt[1].y,然后自增1,也就是打印5;
程序运行结果:
在这里插入图片描述
10、以下程序的运行结果是________。

#include <stdio.h>
struct  contry
{  int  num; 
   char name[20];
}x[5]={1,"China",2,"USA",3,"France",4,"Englan",5,"Spanish"};
int main()
{  int i; 
   for (i=3;i<5;i++)
          printf("%d%c",x[i].num,x[i].name[0]);
    return 0;
}

A、3F4E5S
B、4E5S
C、F4E
D、c2U3F4E

解析:答案选B
代码思路:定义了并初始化了一个结构体数组x,元素分别为5个结构体变量,x[0]={1,“China”},x[1]={2,“USA”},x[2]={3,“France”},x[3]={4,“Englan”},x[4]={5,“Spanish”},然后执行printf(“%d%c”,x[i].num,x[i].name[0]);根据循环可知,需要遍历数组下标为3即x[3]往后的所有元素,但打印的并非访问元素的所有内容,x[i].num是原样打印元素的第一个成员num,但是x[i].name[0]是打印元素的第二个元素的第二个成员name的首元素,即第一个字母,所以应该打印:4E5S。选项B正确。
程序运行结果:
在这里插入图片描述
11、定义以下结构体数组
struct date { int year; int month; int day; };
struct s
{
struct date birthday;
char name[20];
} x[4]={{2008, 10, 1, “guangzhou”},{2009, 12, 25, “Tianjin”}};
语句printf(“%s,%d”,x[0].name,x[1].birthday.year);
的输出结果为________。
A、guangzhou,2009
B、guangzhou,2008
C、Tianjin,2008
D、Tianjin,2009

解析:答案选A
代码思路:首先定义一个结构体数组,数组元素有4个,但是只初始化了第一个和第二个元素,即x[0]={2008, 10, 1, “guangzhou”},x[1]={2009, 12, 25, “Tianjin”},然后执行打印语句printf(“%s,%d”,x[0].name,x[1].birthday.year);,打印第一个元素的name成员,即guangzhou,和打印第二个元素的birthday的成员year,即2009,因此打印:guangzhou,2009。选项A正确。
程序运行结果:
在这里插入图片描述
12、若有以下定义和语句
union data { int i; char c;float f; }x;
则以下语句正确的是________。
A、x=105;
B、x.c=101
C、y=x;
D、printf(“%d\n”,x);

解析:答案选B
共用体变量成员的引用形式:共用体变量名.成员名。选项B正确。

13、设有如下枚举类型定义:
enum language {Basic=3,Assembly=6,Ada=100,COBOL,Fortran};
则枚举常量Fortran的值是________。

A、4
B、7
C、102
D、103

解析:答案选C
C语言将枚举常量的值处理为整型量,编译器按定义时的顺序将枚举常量的默认值设为0、1、2、3……。在定义枚举类型时,可以指定枚举常量的值,其余没有指定值的枚举常量的值是其前一个加1。本题枚举常量Ada=100,所以枚举常量COBOL值为101、Fortran值为102。选项C正确。

14、若有说明:typedef struct { int a; char c;} W; 则以下叙述正确的是
A、编译后系统为W分配5个字节
B、编译后系统为W分配6个字节
C、编译后系统为W分配8个字节
D、编译后系统不为W分配存储空间

解析:答案选D
本题中W是数据类型,typedef的作用就是把含有成员为{ int a; char c;}的结构体换个名字称呼,当需要的结构体变量不多的时候,也可以直接省略结构体名字,但是类型只是抽象的概念、没有存储空间。选项D正确。

15、以下叙述中错误的是________。
A、可以用typedef定义的新类型名来定义变量
B、typedef定义的新类型名必须使用大写字母,否则会出编译错误
C、用typedef可以为基本数据类型定义一个新名称
D、用typedef定义新类型的作用是用一个新的标识符来代表已存在的类型名

解析:答案选B
A、可以用typedef定义的新类型名来定义变量,这本就是typedef的作用。选项A正确。
B、typedef定义的新类型名遵守标识符命名规则即可,没有规定必须使用大写字母。选项B错误。
C、用typedef可以为基本数据类型定义一个新名称。选项C正确。
D、用typedef定义新类型的作用是用一个新的标识符来代表已存在的类型名。选项D正确。
例如我需要一个学生结构体,成员包括年龄、性别、学号,因此我在定义该结构体变量的时候可以把结构体类型用Student来代替,如图:
在这里插入图片描述
16、设有语句typedef struct TT{ char c; int a[4];}CIN; 则下面叙述中正确的是________。
A、可以用 TT 定义结构体变量
B、TT是struct类型的变量
C、可以用 CIN定义结构体变量
D、CIN是struct TT类型的变量

解析:答案选C
可以用struct TT或者CIN定义结构体变量,CIN是struct TT类型但不是变量。

17、设有语句 typedef struct {int n; char c; double x;}STD;
则以下选项中,能正确定义结构体数组并赋初值的语句是________。
A、STD tt[2]={{1,‘A’,62},{2,‘B’,75}};
B、STD tt[2]={1,“A”,62},2,“B”,75};
C、struct tt[2]={{1,‘A’},{2, ‘B’}};
D、struct tt[2]={{1,“A”,62.5},{2, “B”,75.0}};

解析:答案选A
A、STD是成员有{int n; char c; double x;}的结构体类型,重命名之前的结构体类型名称缺省,因此STD tt[2]={{1,‘A’,62},{2,‘B’,75}};定义一个结构体数组并初始化其中的所有元素语句正确。选项A正确。
B、STD tt[2]={1,“A”,62},2,“B”,75};。选项B错误。
C、struct tt[2]={{1,‘A’},{2, ‘B’}};,struct tt结构体类型未事先定义,因此该语句非法。选项C错误。
D、struct tt[2]={{1,“A”,62.5},{2, “B”,75.0}}; struct tt结构体类型未事先定义,因此该语句非法。选项D错误。

18、若有定义和声明
typedef enum{green, red, yellow, blue, black}color;
color flower;
则下列语句中正确的是________。
A、green=red;
B、flower=red;
C、color=red;
D、enum=red;

解析:答案选B
typedef enum{green, red, yellow, blue, black}color;是定义一个枚举类型,是类型,但因typedef重命名为color,color flower;是定义flower为枚举类型的变量,是变量,所以变量才可以赋值。选项B正确。

二、填空题

19、以下程序程序运行结果是________。

#include <stdio.h>
union pw { int i; char ch[5]; } a;
int main( )
{   
a.i=0x44434241;
a.ch[4]=0;
printf("%s\n",a.ch);
return 0;
}

解析:答案为:ABCD
联合体的结构成员,它是共用内存,通过指针或者说通过一个变量进行修改的话啊,实际上修改的是同一块内存,因此格式化打印a.ch的时候,ch[0]=0x41=65=‘A’,ch[1]=0x42=66=‘B’,ch[2]=0x43=67=‘C’,ch[3]=0x44=68=‘D’,ch[4]=0=‘\0’,打印:ABCD。
程序运行结果:
在这里插入图片描述
20、以下程序运行后输出结果是________。

#include <stdio.h>
enum days {mon=1, tue, wed, thu, fri, sat, sun} today=tue;
int main( )
{  printf("%d", (today+2)%7 ); 
   return 0;
}

解析:答案为:4
today=tue=mon+1==1+1=2,所以(today+2)%7=4%7=4,打印:4。
程序运行结果:
在这里插入图片描述
21、以下程序运行后输出结果是________。

#include <stdio.h>
enum color{BLACK,YELLOW,BLUE=3,GREEN,WHITE};
int main( )
{  
char colorname[][80]={"Black","Yellow","Blue","Green","White"};
enum color c1=GREEN,c2=BLUE;
printf("%s", colorname[c1-c2]);
return 0;
}

解析:答案为:Yellow
c1=GREEN=4,c2=BLUE=3,c1-c2=1,colorname[c1-c2]=colorname[1]=“Yellow”,打印:Yellow。
程序运行结果:
在这里插入图片描述
22、以下程序运行后输出结果是________。

#include <stdio.h>
enum {A,B,C=4} i;
int main( )
{
int k=0;
for(i=B; i<C; i++) 
k++;
printf("%d",k);
return 0;
}

解析:答案为:3
i=B=1,所以从1循环到3时一共循环3次,因此k=3。打印:3。
程序运行结果:在这里插入图片描述
23、以下程序的运行结果是________。

#include<stdio.h>
int main()
{  
union { char i[2]; int k; }stu;
stu.i[0]='2';
stu.k=0;
printf("%s %d",stu.i,stu.k);
retrun 0;
}

解析:0
共用体数据类型的特点:当为一个共用体成员赋值时,其他成员的值就会被覆盖掉。共用体变量stu在内存占4个字节,它的两个成员char i[2]和int k在内存的起始地址相同。执行stu.i[0]=‘2’;,给变量的第1个字节赋了’2’的ASCII码,执行stu.k=0;,给变量的4个字节赋值0,覆盖了前面所赋第1个字节的内容,所以stu.i第1个字节的值为0,表示空串,无输出。
程序运行结果:
在这里插入图片描述

三、判断题

24、以下结构体类型的定义是否正确?

struct student
{  
int no ;
char name[20] ;
struct date
{ 
int month ;
int day ;
int year ;
}birthday ;
unsigned sex ;
float score ;
};

A、对
B、错

解析:答案为:对
结构体类型可以嵌套定义。因此正确,虽然为判断题,但是这道题是以填空题形式出现,因此填对。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一直学不会编程的小徐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值