12.0本章内容导读
之前已经来过一堆数据了,本周又来了一堆数据,这堆数据和之前来过的那堆数据有何不同呢?如果说前面来的都是清一色的陆战队的话,那么本周则是海陆空一起来了,它更强大了。
本周,我们要介绍几种新的数据类型:结构体、共用体和枚举类型。
结构体的应用主要体现在可以用于精简向函数传递的参数以及实现动态数据结构上,前者在本周介绍,后者则在下一周介绍。本周的最后,我们还要介绍结构体的一个典型应用实例——洗发牌模拟。如何用一种较为直观和自然的方式来表示52张扑克牌呢?洗发牌又该如何模拟呢?
与结构体长得很像的是共用体,它是结构体的亲密伙伴,那么共用体又有什么用呢?这个也许你只知其一,而不知其二吧?
还有枚举类型,它是一个经常被人遗忘的角落,至于它有什么用,则更少被人关注了。
C语言的核心内容到本周就结束了,后面几周的内容都是它的外延,这是为什么?
迷雾重重,想探寻它的究竟,就进来瞧瞧吧!
12.1
结构体类型的声明
两个结构体变量的成员同名是否会冲突?
下面这个结构体中的成员studentID定义为何种类型更好呢?请说明理由。
struct student
{
long studentID; //学号
char studentName[10]; //姓名
char studentSex; //性别
int yearOfBirth; //出生年
int score[4]; //4门课的成绩
}stu1;struct employee
{
long employeeID; //职工号
char studentName[10]; //姓名
char studentSex; //性别
int yearOfBirth; //出生年
int salary; //工资
}epy1;
1
下面哪条语句是正确的。
A
typedef struct student
{
long studentID;
char studentName[10];
char studentSex;
int yearOfBirth;
int score[4];
}STUDENT;
STUDENT stu1 = {100310121, "王刚", 'M', 1991, {72,83,90,82}};
B
typedef struct STUDENT
{
long studentID;
char studentName[10];
char studentSex;
int yearOfBirth;
int score[4];
};
STUDENT stu1 = {100310121, "王刚", 'M', 1991, {72,83,90,82}};
C
struct
{
long studentID;
char studentName[10];
char studentSex;
int yearOfBirth;
int score[4];
};
struct stu1;
D
struct student
{
long studentID;
char studentName[10];
char studentSex;
int yearOfBirth;
int score[4];
}STUDENT;
STUDENT stu1 = {100310121, "王刚", 'M', 1991, {72,83,90,82}};
2 判断题
关键字typedef主要用于定义一种新的数据类型。(F)
12.2
1 判断题
在一个结构体内可以包含另一个不同类型的结构体作为其成员。(T)
2 结构体的嵌套
下面的结构体类型的声明是否合法?在声明一个结构体类型的时候,其内部可不可以嵌套这个结构体自身呢?即可不可以用与自身结构体类型相同的结构体作为其成员呢?请说明原因。
struct sample
{
int data;
struct sample next;
};
12.3
1 结构体类型所占内存的字节数
1 下列说法错误的是()。
A. 结构体类型所占内存的字节数就是结构体的每个成员类型所占内存字节数的总和。
B. 结构体在内存中所占的字节数不仅与所定义的结构体类型有关,还与计算机系统本身有关。
C. 计算结构体所占内存的字节数时,一定要使用sizeof运算符。
D. 内存对齐的主要目的就是为了提高内存的寻址效率。不同的系统和编译器,内存对齐方式可能会不同,是机器相关的。
2 对结构体的操作
1 下列说法错误的是()。
A. 对结构体变量的成员的访问是通过名字并使用成员选择运算符来访问的。
B. 只能在相同类型的结构体变量之间进行赋值。
C. 可以使用==和!=来判定两个结构体相等或不等。
D. 对嵌套的结构体成员,必须以级联的方式来访问。
3 内存对齐的深入讨论
是否可能会在结构体的开始处有补位?猜猜有可能是什么原因?
为什么C语言不支持使用==来判定两个结构体是否相等?这个和本节介绍的什么内容有可能有关?
1、 不会,因为CPU读取内存时是按块进行读取的,内存对齐是为了加快CPU读取效率。从开始处就补位没有必要。
2、 可能与本节的对齐有关, 猜测如果要兼顾“结构体在内存中所占的字节数不仅与所定义的结构体类型有关,还与计算机系统本身有关”这两者的话,因为要保证与计算机系统本身相关的那么波动性较大,比较难实现。
12.4
1 结构体变量的访问
1 已知:
typedef struct date
{
int year;
int month;
int day;
}DATE;
typedef struct student
{
long studentID;
char studentName[10];
char studentSex;
DATE birthday;
int score[4];
}STUDENT;
STUDENT stu1;
STUDENT *pt = &stu1;
则下列访问结构体变量的方法中,哪个是错误的。
A. stu1. birthday. year = 1999;
B. (*pt). birthday. year = 1999;
C. pt -> birthday -> year = 1999;
D. pt -> birthday. year = 1999;
2 向函数传递结构体
1 下列说法错误的是()。
A. 用结构体变量做函数参数,是将整个结构体的所有成员的内容传给被调函数,因此在被调函数中对结构体内容的修改不影响原结构体变量。
B. 用结构体数组/结构体指针作函数参数的参数传递效率比用结构体变量做函数参数的参数传递效率要高。
C. 用结构体数组/结构体指针作函数参数,是复制结构体的首地址给被调函数,因此在被调函数中可以修改结构体指针所指向的结构体的内容。
D. 数组和结构体变量都不可以用做函数返回值的类型。
3 pt++的含义
已知:
typedef struct date
{
int year;
int month;
int day;
}DATE;
typedef struct student
{
long studentID;
char studentName[10];
char studentSex;
DATE birthday;
int score[4];
}STUDENT;
STUDENT stu[30];
STUDENT *pt = stu;
则pt++表示什么?pt实际增加的字节数如何计算?
A:Node s=(Node*)malloc(sizeof(Node));
4 指向结构体数组的指针做函数参数
指向结构体数组的指针做函数参数
如果将下面函数的第一个形参STUDENT stu[]修改为指向结构体数组的指针,即STUDENT *pt,那么程序该如何修改?
void AverScore(STUDENT stu[], int n, int m) {
int i, j;
for (i=0; i<n; i++)
{
stu[i].sum = 0;
for (j=0; j<m; j++)
{
stu[i].sum = stu[i].sum + stu[i].score[j];
}
stu[i].aver = (float)stu[i].sum/m;
}
}
A:
void AverScore(STUDENT *pt, int n, int m) {
int i, j;
for (i = 0; i < n; i++) {
pt->sum = 0;
for (j = 0; j < m; j++) {
pt->sum = pt->sum +pt->score[j];
}
pt->aver = (float) pt->sum / m;
pt++;
}
}
12.5
1 枚举类型
1 下列对枚举类型的使用的代码中错误的是()。
A
enum {no, yes, none}answer;
if (answer == yes) {
printf("Yes\n");
}
B
enum response{no = -1, yes = 1, none = 0};
enum response answer;
C
answer = yes;
printf("%d", answer);
D
answer = "yes";
printf("%s", answer);
2 和整型、实型、字符型一样,枚举类型也是一种基本数据类型。(T)
2 共用体类型
1 下列说法错误的是()。
A. 编译器只为共用体中最大的成员分配足够的内存空间。共用体的成员在这个空间内是彼此覆盖的,都从同一起始地址开始存储。
B. 与结构体不同的是,共用体在内存中所占空间的字节数取决于占空间最多的那个成员变量。
C. 共用体变量在每一瞬时只能保存一个成员,起作用的成员是最后一次赋值的成员。
D. 共用体和结构体的成员访问方式以及成员的初始化方式都是一样的,都使用成员选择运算符访问成员变量,都可以在定义的时候对所有成员进行初始化。
3 枚举类型
你认为枚举类型有什么用?
A: 提高可读性。 ENUM类型的数据只能从枚举列表中取,并且只能取一个。
4 结构体和共用体
如何在程序的几个文件中共享结构体和共用体类型?你认为结构体和共用体最重要的应用是什么?使用结构体和共用体类型的好处是什么?
如何在程序的几个文件中共享结构体和共用体类型: 使用extern 作为存储类型
你认为结构体和共用体最重要的应用是什么: 以逻辑相关,基本类型不一致的一群变量整合在一起。增强了C语言的功能,从而提高程序的可读性、可维护性和可扩展性。
使用结构体和共用体类型的好处是什么:使用结构体和共用体类型的好处是可以将多个数据组合成一个整体,方便进行操作。
12.6
洗发牌算法的深入讨论
本节介绍的洗发牌程序,只是修改了数组result中保存的发牌序号,通过对发牌序号随机乱序实现了洗牌的效果,并没有实际修改结构体数组card中按序存放的牌面和花色。请问如果要将结构体数组中的牌面和花色也进行乱序存放,那么程序应该如何修改?请分析对比这两种方法各自的优缺点。
标签:pt,int,char,枚举,STUDENT,类型,共用,结构 From: https://www.cnblogs.com/hedyqian/p/17430845.html