自定义类型:结构体 位段 枚举 联合

本文详细介绍了结构体和联合体的基本概念、声明方式、成员访问、内存对齐及传参等内容,并对比了它们的区别。此外,还涉及了位段和枚举的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

结构体

1.结构体的地址 :地址从小到大,且结构体的地址和第一个成员的地址相同,元素地址依次增大

2.结构体的声明 :结构体是一些值得集合,这些值称为成员变量,每个成员可以是不同类型的变量


3.结构体成员的访问

结构体变量访问成员 :通过( . )访问,点操作符接受两个操作数

struct stu
{
	char name[20];
	int age;
};

int main()
{
	struct stu s;
	strcpy(s.name, "zhangsan");
	s.age = 20; //通过点操作符访问结构体成员
}
结构体访问指向变量的成员 :通过( -> )访问

struct stu
{
	char name[20];
	int age;
};

int main()
{
	struct stu *s;
	strcpy(s->name, "zhangsan");
	s->.age = 20; //通过 -> 指向访问结构体成员
}
4.结构体的自引用

5.结构体内存对齐 :计算结构体的大小 (单位:字节)

    规则:(1)第一个成员在与结构体偏移量为0的地址处

(2)其余变量要对齐到对齐数的整数倍的地址处

  对齐数=编译器默认对齐数与该成员大小的最小值(VS 默认 8   Linux 默认 4)

(3)结构体总大小为最大对齐数的整倍数

(4)如果结构体嵌套结构体,嵌套的结构体对齐到自己的最大对齐数的整倍数。结构体整体的对齐数为最大对齐数的整倍数

例1:


例2:


S1与S2的类型成员完全相同,但是S2比S1所占内存却更小。

所以,在我们设计结构体时,为了节省空间,我们应尽量让占用空间小的成员聚集在一起。


例3:


例4:



6.结构体传参


分析以上的代码,print1和print2选择哪一个进行结构体传参?

应首选pring2

因为函数传参时需要创建栈帧结构,在传递结构体对象时,如果结构体过大,参数压栈系统开销比较大,导致性能下降。


位段

1.成员:位段的成员必须输 int,unsigned int,signed int,char。成员名后面有一个冒号和一个数字。

2.创建:创建方法与结构体一致,只是在每个成员后加一个冒号和一个数组。

struct A
{
	int a : 2;
	int b : 5;
	int c : 10;
	int d : 30;
}A;
3.位段的大小:

位段成员冒号后的数字代表这个成员所占有的bit位的位数



与结构体相比,位段可以节省很多空间,但是无法解决跨平台问题。


枚举

1.枚举就是将现实中有限的集合一一列举出来

2.枚举类型的定义:

enum Day
{
	Mon,
	Tues,
	Wed,
	Thur,
	Fri,
	Sat,
	Sun
};
{}中的内容是枚举的可能取值,也叫枚举常量。这些可能取值都是有值得,默认是从0开始,一次递增1

也可以在定义的时候赋值,赋值以前的元素依旧保持从0开始,依次递增1,在赋值以后的可能取值按赋的值依次递增1

3:有点

(1)代码的可读性高

(2)比#define定义的标识符更加的严谨

(3)防止命名污染

(4)便于调试

(5)使用方便,一次可定义多个常量


联合(共用体)

1.联合类型的声明

union Un
{
	char c;
	int i;
};
联合也是一种自定义类型。

这种类型定义的变量包含一系列成员,这些成员公用一块空间。

每一个成员的地址都等于联合体的地址

2.联合体的大小:

(1)联合体的大小,至少是最大成员的大小


(2)当最大成员的大小不是最大对齐数的整数倍时,就要对齐到最大对齐数的整数倍。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值