C语言期末习题(结构体开始)

C语言期末习题汇总(超级硬核系列)

结构体

题目1: 结构体的基本概念

如有以下代码:

struct student
{
  int num;
  char name[32];
  float score;
}stu;

则下面的叙述不正确的是:( )

A.struct 是结构体类型的关键字

B.struct student 是用户定义的结构体类型

C.num, score 都是结构体成员名

D.stu 是用户定义的结构体类型名

解析

struct student
{
  int num;
  char name[32];
  float score;
}stu;//stu是变量

答案 :D

题目2:结构体成员的访问

下面程序的输出结果是:( )

struct stu
{
    int num;
    char name[10];
    int age;
};

void fun(struct stu *p)
{
	printf("%s\n",(*p).name);
	return;
}

int main()
{
	struct stu students[3] = {
  
  {9801,"zhang",20},
							 {9802,"wang",19},
                    {9803,"zhao",18} };
   fun(students + 1);
	return 0;
}

A.zhang

B.zhao

C.wang

D.18

解析

(*p).name 是访问结构体,fun(students+1)意思是访问结构体的第二个成员,不管结构体的实例是什么——访问其成员其实就是加成员的偏移量

答案 :C

题目3:结构体成员的访问

下面程序要求输出结构体中成员a的数据,以下不能填入横线处的内容是( )

#include < stdio.h >
struct S
{ 
  int a;
  int b; 
};
int main( )
{ 
  struct S a, *p=&a;
  a.a = 99;
  printf( "%d\n", __________);
  return 0;
}

A.a.a

B.*p.a

C.p->a

D.(*p).a

解析

指针->成员

结构体变量. 成员

答案 :B

题目4:结构体对齐原则(超级重要

在VS2013下,默认对齐数为8字节,这个结构体所占的空间大小是( )字节

typedef struct{
  int a;
  char b;
  short c;
  short d;
}AA_t;

A.16

B.9

C.12

D.8

解析

这个题目需要我们去画出内存图

图例1:
在这里插入图片描述

在这里插入图片描述

步骤一:首先标出所有类型的数的字节大小

步骤二:与默认对齐数进行对比,判断所占空间大小

步骤三:从0开始,开始计算,根据对齐原则,得到上述结果

结构体思维导图

题目5:结构体对齐原则

在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是( )

struct A
{
	int a;
	short b;
	int c;
	char d;
};

struct B
{
	int a;
	short b;
	char c;
	int d;
};

A.16,16

B.13,12

C.16,12

D.11,16

解析

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

题目6:结构体对齐原则

下面代码的结果是:( )

#pragma pack(4)/*编译选项,表示4字节对齐 平台:VS2013。语言:C语言*/
//假设long 是4个字节
int main(int argc, char* argv[])
{
  struct tagTest1
  {
    short a;
    char d; 
    long b;   
    long c;   
  };
  struct tagTest2
  {
    long b;   
    short c;
    char d;
    long a;   
  };
  struct tagTest3
  {
    short c;
    long b;
    char d;   
    long a;   
  };
  struct tagTest1 stT1;
  struct tagTest2 stT2;
  struct tagTest3 stT3;

  printf("%d %d %d", sizeof(stT1), sizeof(stT2), sizeof(stT3));
  return 0;
}
#pragma pack()

A.12 12 16

B.11 11 11

C.12 11 16

D.11 11 16

在这里插入图片描述

题目7:位段大小的计算

有如下宏定义和结构定义

#define MAX_SIZE A+B
struct _Record_Struct
{
  unsigned char Env_Alarm_ID : 4;
  unsigned char Para1 : 2;
  unsigned char state;
  unsigned char avail : 1;
}*Env_Alarm_Record;
struct _Record_Struct *pointer = (struct _Record_Struct*)malloc(sizeof(struct _Record_Struct) * MAX_SIZE);

当A=2, B=3时,pointer分配( )个字节的空间。

A.20

B.15

C.11

D.9

解析

#define MAX_SIZE 2+3
struct _Record_Struct
{
  unsigned char Env_Alarm_ID : 4;//1个字节是八个比特位,这个位段是占4个比特位
  unsigned char Para1 : 2;//这个是占2个比特位
    //上面两个一共占了6个比特位,占了1个字节
  unsigned char state;//没有进行表识,说明了它独占1个字节
  unsigned char avail : 1;//这也占了一个字节
}*Env_Alarm_Record;
struct _Record_Struct *pointer = (struct _Record_Struct*)malloc(sizeof(struct _Record_Struct) * 2+3);

答案:D

题目8:位段大小的计算+大小端字节序存储+结构体访问

下面代码的结果是( )

int main()
{
  unsigned char puc[4];
  struct tagPIM
  {
    unsigned char ucPim1;
    unsigned char ucData0 : 1;
    unsigned char ucData1 : 2;
    unsigned char ucData2 : 3;
  }*pstPimData;
  pstPimData = (struct tagPIM*)puc;
  memset(puc,0,4);
  pstPimData->ucPim1 = 2; 
  pstPimData->ucData0 = 3;
  pstPimData->ucData1 = 4;
  pstPimData->ucData2 = 5;
  printf("%02x %02x %02x %02x\n",puc[0], puc[1], puc[2], puc[3]);
  return 0;
}

A.02 03 04 05

B.02 29 00 00

C.02 25 00 00

D.02 29 04 00

解析

在这里插入图片描述

枚举

题目1:枚举类型的存储类型

以下关于枚举的说法,哪个是正确的?()

A.枚举类型可以具有浮点数作为枚举值。

B.枚举类型在内存中存储为整数。

C.枚举类型可以包含字符串作为枚举值。

D.枚举类型不能作为函数的参数传递。

解析:

枚举类型在内存中存储为整数,浮点数和整数都不可以,正确答案为B。

D枚举类型能作为函数的参数传递

例子如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
enum COLOR
{
   
   
	RED,
	BLACK
}co;
void Func(enum COLOR x)
{
   
   

}
int main()
{
   
   
	Func(RED);
	return 0;
}

题目2:枚举的计数方式

下面代码的结果是:( )

enum 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值