带你彻底分清什么是结构体,联合体以及枚举

一、结构体

1、什么是结构体

在C语言中,结构体指的是一种数据结构,是C语言中聚合数据类型的一类。结构体可以被声明为变量、指针或数组等,用以实现较复杂的数据结构。结构体同时也是一些元素的集合,这些元素称为结构体的成员,且这些成员可以为不同的类型,成员一般用名字访问。也就是说,结构体是由多种原宿所构成的数据结构。

  • 如何建立结构体
struct s
{
	char a;
	char b;
	int c;
	short d;
}s1,s2;

上图就是我定义的一个结构体,其中struct表示定义的是一个结构体,s表示的是结构体名。这两个合在一起的struct s也就是我们定义的结构体类型了。也就是我们平时所用的int,char这种类型。
最后s1和s2就是结构体变量名了。
在这个结构体中还有4个变量,分别是char类型的a和b,int类型的c以及short类型的d,而这四个元素也就构成了我们这个结构体。

  • 知道了如何构建一个结构体,那该怎么使用这个结构体呢?

在这里插入图片描述

  • 上面的代码我写出了两种最常见的结构体用法,首先是定义的s1与s2,我们可以看出他们定义的位置是不同的,其中s2表示的是全局变量,而s1表示的是局部变量。
  • 赋值方面,s1的初始化没有具体到某一个结构体中的元素,所以它的初始化是按照结构体中的元素顺序来初始化的。s2的初始化就是具体到了某一个元素对其进行初始化。
  • 在printf中我们也可以看到两种不同的使用方法,这是因为s1是直接通过结构体来输出的,而s2的输出方法则是通过指针来进行输出的。
  • 最后我们还可以看到结构体的所占内存是12,但结构体中的是两个char,一个int和一个short类型的元素,按理说只会占用8个字节,可为什么会是12个字节呢?这就要提到结构体的内存对齐了。

2、结构体的内存对齐

  • 什么是结构体的内存对齐?
    当我们创建一个结构体变量时,会向内存申请所需的空间,用来存储结构体成员的内容。但计算机为了提高结构体的运行效率,会把其成员的位置进行偏移,即按照特定的规则来存储数据内容。
  • 结构体内存对齐规则
    1、结构体的第一个成员直接对齐到相对于结构体变量起始位置为0的偏移处。
    2、从第二个成员开始,要对齐到某个对齐数的整数倍的偏移处。
    对齐数是结构体成员自身大小的默认对齐数的较小的一个。(vs中默认对齐数为8)
    其中Linux环境默认不设对齐数(对齐数是结构体成员自身的大小)。
    举个例子,int是4个字节,4小于8,所以它的对齐数为4。
    3、结构体的总大小,必须是最大对齐数的整数倍。
    每个结构体成员都有一个对齐数,其中最大的对齐数就是最大对齐数。
    4、对于嵌套了结构体的情况,嵌套结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数的整数倍。(包括嵌套结构体的对齐数)
  • 了解了对齐规则之后,我们就可以知道为什么上述结构体的大小是12了。
    在这里插入图片描述
    其中第一个成员对对齐到偏移量为0的位置,第二个成员类型是char,大小是1个字节小于8,所以第二个成员的对齐数是1。第三个成员的类型是int,大小是4个字节,小于8,所以它的对齐数是4,它就对跳到偏移量是4的倍数的位置即图中4的位置。最后一个成员的类型是short,对齐数是2,8是2的整数倍。最后得出整个结构体的最大对齐数是4,也就是说结构体的大小会是4的倍数,所以最后结构体的大小是12。

二、联合体

1、什么是联合体

在进行某些算法的C语言编程的时候,需要使几种不同类型的变量存放到同一段内存单元中。也就是使用覆盖技术,几个变量互相覆盖。这种几个不同的变量共同占用一段内存的结构,在C语言中,被称作“共用体”类型结构,简称共用体,也叫联合体。通俗来说就是联合体的成员会共用一块地址。

  • 联合体的构建

在这里插入图片描述
通过上面代码我们可以发现联合体与结构体有很多类似的地方,例如申明以及定义的方式。但初始化的时候对于结构体来说是对其中所有成员进行初始化,但结构体却只用初始化一个就可以为其中的每一个成员赋值。

2、联合体的特点

  • 首先,联合体的大小是其中最大成员大小的整数倍。
  • 其次,联合体的所有成员共用同一个地址,虽然有可能类型不一样,但由于他们在内存中都是以二进制的方式组成的,类型不同只是读取的方式会有不同,所以读取出来的结果也会有所不同。
    就如上述代码,char是以ASCII码值储存的。0的ASCII值是48,所以以i整形的方式输出的时候就会输出48,但以字符的方式输出时就会输出字符‘0’。

三、枚举

1、什么是枚举常量

枚举是列出某些有穷序列集的所有成员的程序,或者是一种特定类型对象的计数。这两种类型经常(但不总是)重叠。是一个被命名的整型常数的集合。即是在一定范围内取值,并且这个值必须是枚举类型中的任意一个,并且只能有一个。

2、枚举的特点

首先上代码

在这里插入图片描述
通过上述代码,不难发现a,b,c等没有赋值的成员也有了值这是为什么?
那就得先来仔细说说枚举的的特点了。
1、枚举中所有的成员,必须出现在枚举对象的下面。
2、枚举中成员是以逗号来间隔开来的,分号是可以省略的,但如果枚举类中有一个成员,那么枚举对象最后不能省略分号。
3、枚举中初始常数的序数为零,往后成员依次加1,如果对其中一个成员赋值,那么接下来的一个成员则是所赋值加1。

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值