首页 > 其他分享 >结构体、共用体、枚举类型

结构体、共用体、枚举类型

时间:2023-05-25 13:13:24浏览次数:29  
标签:pt int char 枚举 STUDENT 类型 共用 结构

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

相关文章

  • 计算并且四舍五入 判断是否数字类型
    StringuserateNow="0";//当前使用率if(ObjectUtil.isNotNull(numSpaceS)&&ObjectUtil.isNotNull(numSpaceU)&&numSpaceS!=0&&numSpaceU!=0){BigDecimaluserateNowSize=newBigDecimal((double)numSpaceU/(double)numSpaceS*100)......
  • 怎么买美股?如何选择美股交易订单类型?
    怎么买美股,前文说的开立美股账户只是基础的一步。在正式开始美股交易前,还有许多准备工作需要完成,其中就包括选择美股交易订单类型。市场上的美股交易订单类型有哪些?如何选择适合自己的美股交易订单类型?美股交易订单类型一、市价单市价订单是按市场当时最优价或市价立即购买或出售一......
  • 泛型是一种将类型参数化的动态机制,使用得到的话,可以从以下的方面提升的你的程序
    泛型是一种将类型参数化的动态机制,使用得到的话,可以从以下的方面提升的你的程序:安全性:使用泛型可以使代码更加安全可靠,因为泛型提供了编译时的类型检查,使得编译器能够在编译阶段捕捉到类型错误。通过在编译时检查类型一致性,可以避免在运行时出现类型转换错误和 ClassCastExcept......
  • 布尔类型
    在Python中,布尔类型(bool)是用于表示真(True)或假(False)的数据类型。它们通常用于控制程序流程和逻辑判断。例如:a=True#创建一个布尔变量,值为Trueb=False#创建一个布尔变量,值为False注意True和False是Python中的关键字,它们分别表示真和假。在Python中,除了0、空字符......
  • 列表类型
    一、列表(list)在Python中,列表类型(list)是用于表示一个有序、可变的集合的数据类型。列表可以包含任意类型的数据,包括整数、浮点数、字符串、甚至其他列表等。例如:a=[1,2,3,4]#创建一个包含整数的列表b=['apple','orange','banana']#创建一个包含字符串的列表c......
  • 字典类型
    在Python中,字典类型(dict)是用于表示一个无序、可变的键值对集合的数据类型。每个键值对都由一个唯一的键(key)和对应的值(value)组成。字典中的键必须是唯一的,并且只能是不可变类型,比如整数、字符串和元组等;而值可以是任意类型的数据,包括整数、浮点数、字符串、列表、甚至其他字......
  • 找不到“element-plus/global”的类型定义文件。 程序包含该文件是因为: 在 compilerO
    问题描述在tsconfig.json文件里types字段添加"element-plus/global"后出现报错。问题原因TS升级到5.x带来的规范性问题。可以通过npmviewtypescriptversion命令查看下你的TS版本。深层分析参考这篇:https://github.com/element-plus/element-plus/issues/12119问题解决1......
  • 数字类型
    在Python中,数字类型包括整型(int)、浮点型(float)和复数(complex)三种类型。整型(int):整型是Python中最基本的数字类型之一,用于表示整数。在Python中,整型可以表示任意大的整数,没有整型溢出的问题。例如:age=18#age=int(18)print(id(age))print(type(age))print(age)a......
  • 数据类型
    Python中常见的数据类型有:数字类型:包括整型(int)、浮点型(float)、复数(complex)。字符串类型(str):用于表示一段文本,可以用单引号、双引号或三引号括起来。布尔类型(bool):用于表示真(True)或假(False)。列表类型(list):可变序列类型,用于存储一系列元素。元组类型(tuple):不可变......
  • 【JavaScript用法】JavaScript(JS)的基本语法(JS数据类型,JS变量,JS运算符,JS流程控制语句
    JavaScript(JS)的基本语法目录JavaScript(JS)的基本语法一.与html结合方式二.注释三.数据类型:四.变量五.运算符(和Java有点类似)六.流程控制语句(和JAVA 类似):七.JS特殊语法:一.与html结合方式       1.内部JS:定义<script>,标签体内容就是js代码(可以理解为和html......