自定义数据类型

自定义数据成员

结构体,枚举,自定义

1.结构体

在这里插入图片描述

1.结构体的声明

结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。

2.匿名结构体类型(只用一次)

在这里插入图片描述

3.结构体的内存对齐(计算结构体大小)

在这里插入图片描述

后来的理解

从三个角度来考虑:
1.对于类(或结构体)中的一个变量而言,他要在对齐数(较小值)的整数倍地址处。
2.对于整个类(或结构体),它的总大小(可用sizeof计算)一定是最大对齐数(相对于各数据成员而言)的整数倍。s
3.一个对象所占空间大小只取决于该对象中数据成员所占空间,而与成员函数无关。

提示

第一条中偏差为0的地址的理解,如果我们把之后的地址(所代表的内存空间)都以此(偏差为0的地址)为标准来编一个数字序列,那么这个序列是从0开始的,第二条由此理解:比如对于char,double a。double a,a的对齐数是8,所以要从偏差为8始对齐。那在偏差8之前就会有偏差(0~7个byte)。
在这里插入图片描述

默认对齐数:gcc没有
代码示例:
main()
{
	struct s3
	{
		double d;
		char c;
		int i;
	}s3;
	printf("%d\n", sizeof(s3));
}
结果:16
嵌套结构体大小的计算
为什么存在内存对齐

在这里插入图片描述

修改默认对齐数的方式

在这里插入图片描述

#pragma pack(4)//设置默认对齐数为4
#pragma pack()//取消设置的默认对齐数
计算结构体成员的偏移量offsetof( )

在这里插入图片描述

关于宏

之前提到过一次,#define,参数可以传类型

代码举例
#include<stddef.h>
main()
{
	struct s3
	{
		double d;//从0开始
		char c;//偏移量为8,前面是偏移量0-7共8个byte
		int i;//8+4=12
	}s3;
	printf("%d\n", offsetof(struct s3,d));
	printf("%d\n", offsetof(struct s3, c));
	printf("%d\n", offsetof(struct s3, i));
}
结构

在这里插入图片描述

4.结构体传参

5.位段

位段的定义

在这里插入图片描述

代码

在这里插入图片描述

解释

在这里插入图片描述在这里插入图片描述

6.枚举

在这里插入图片描述

代码示例

在这里插入图片描述

枚举的优点

在这里插入图片描述

7.联合(又名联合体,共用体)

定义

在这里插入图片描述

代码示例

在这里插入图片描述

联合体的特点在这里插入图片描述
结枚联的区别

关键字,性质

联合体判断大小端存储

在这里插入图片描述

联合体大小的计算
![在这里插入图片描述](https://img-blog.csdnimg.cn/bb74c0fdab6d4215928a14a3537c2e06.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAeWFuZ2hhbmc2NjY2NjY=,size_20,color_FFFFFF,t_70,g_se,x_16)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值