[C语言]-自定义类型:结构体、枚举、联合

目录

一. 结构体

1.1 结构体的声明

1.2 结构体自引用

1.3 结构体变量的定义和初始化

2. 计算结构体的大小

3. 结构体的传参

二. 位段

1. 位段的声明

2.位段的内存分配

3. 位段与结构体的区别

三.枚举 

1. 枚举的定义

2. 枚举的优点

3. 枚举的使用

四. 联合(共用体)

1. 联合类型的定义

2. 联合大小的计算


一. 结构体

1.1 结构体的声明

struct tag  //struct:关键字  tag:根据需求自己定

{ 
    member-list; //结构体的成员变量列表

}variable-list; //结构体变量列表

struct tag vl={}; //结构体变量
结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。

比如说描述学生的结构体:

struct Stu
{
 char name[20];//名字
 int age;//年龄
 char sex[5];//性别
 char id[20];//学号
}; 

1.2 结构体自引用

struct Node 
{ 
    int data; 
    struct Node* next; //next指向下一节点的指针
};

1.3 结构体变量的定义和初始化

struct Point //类型声明
{ 
    int x; 
    int y; 
}p1={x,y}; //声明类型的同时定义变量p1同时初始化
struct Point p2={x,y}; //定义结构体变量p2同时初始化 

struct Node 
{ 
    int data; 
    struct Point p; 
    struct Node* next; 
};
struct Node n1 = {20, {5, 6}, NULL};//结构体嵌套初始化

2. 计算结构体的大小

计算结构体大小时,我们需要了解结构体的对齐数

结构体的对齐规则

对齐数 = 结构体成员自身的大小与编译器默认对齐数的较小值

VS中默认的值为8     #pragma(1) 这个预处理指令,可以改变我们的默认对齐数。

1. 第一个成员在与结构体变量偏移量为0的地址处

2. 其他成员变量要对齐到对齐数的整数倍的地址处。  

3. 结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。

4. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

3. 结构体的传参

void print2(struct S* ps) 
{ 
    printf("%d\n", ps->num); 
} 
int main() 
{ 	 
    print2(&s); //传地址 
    return 0; 
}
函数传参的时候,参数是需要压栈,会有时间和空间上的系统开销。如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的下降。所以结构体传参的时候,要传结构体的地址。

二. 位段

1. 位段的声明

位段的声明和结构是类似的,但是有两个不同:

1.位段的成员必须是 int、unsigned int 或signed int或char 。

2.位段的成员名后边有一个冒号和一个数字。

struct A   
{ 
    int _a:2; 
    int _b:5; 
    int _c:10; 
};

2.位段的内存分配

位段——其中位是二进制位

位段的空间上是按照需要以4个字节( int )或者1个字节( char )的方式来开辟的。

冒号后面的数字是所占比特位大小。

3. 位段与结构体的区别

位段涉及很多不确定因素,位段是不跨平台的,注重可移植的程序应该避免使用位段。

跟结构相比,位段可以很好的节省空间,但是有跨平台的问题存在。

三.枚举 

枚举顾名思义就是一一列举,把可能的取值一一列举 。

比如我们现实生活中:
周一到周五、12个月份、性别、颜色等都可以使用枚举。

1. 枚举的定义

enum Day//星期
{
 Mon,
 Tues,
 Wed,
 Thur,
 Fri,
 Sat,
 Sun
};
enum Sex//性别
{
 MALE,
 FEMALE,
 SECRET
};
enum Color//颜色
{
 RED,
 GREEN,
 BLUE
};
以上定义的 enum Day enum Sex enum Color 都是枚举类型。
{} 中的内容是枚举类型的可能取值,也叫 枚举常量

这些可能取值都是有值的,默认从0开始,一次递增1,也可以在定义的时候赋初值。

2. 枚举的优点

① 增加代码的可读性和可维护性

② 和#define定义的标识符比较枚举有类型检查,更加严谨。

③ 防止了命名污染(封装)

④ 便于调试

⑤ 使用方便,一次可以定义多个常量

3. 枚举的使用

enum Color
{
 RED=1,
 GREEN=2,
 BLUE=4
};
enum Color clr = GREEN;

只能拿枚举常量给枚举变量赋值,才不会出现类型的差异。

四. 联合(共用体)

1. 联合类型的定义

联合也是一种特殊的自定义类型
这种类型定义的变量也包含一系列的成员,特征是这些成员公用同一块空间。
//联合类型的声明
union Un
{
 char c;
 int i;
};
//联合变量的定义
union Un un;

2. 联合大小的计算

联合的成员是共用同一块内存空间的,联合的大小至少是最大成员的大小。
当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍

因为联合的成员是共用同一块内存空间的,我们可以利用这一点判断当前计算机的大小端存储

int check()
{
	union Un
	{
		char c;
		int i;
	}u;
	u.i = 1;
	return u.c;
}

int main()
{
	int num = 1;
	int ret = check();
	if (ret == 1)
		printf("小端\n");
	else
		printf("大端\n");
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值