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

&spm=1001.2101.3001.5002&articleId=139759982&d=1&t=3&u=e8c15df4d70e4b4b99330946569bfd6b)
7949

被折叠的 条评论
为什么被折叠?



