c语言结构体一篇懂


1——什么是结构体

它是一种可以由多种类型数据或单种类型创建的数据类型,比如,你想表达一台电脑,那这个电脑是一个统称,它里面是不是还包含很多东西,比如电脑的品牌(可以是char类型来表达),比如型号(可以用整形来表示),比如价格带小数(我们可以用double来表示)。


2——结构体定义形式与细节

struct stu
{
	char name;
	int id;
	double money;
};

一:struct 为结构体关键字;
二:stu 为结构体名;
三:name 。id ,money为结构体成员,也可以称为结构体变量。
四:注意’}‘号后面是有’;‘号的,这个不可缺少。
五:像int char double这些类型我们不可以再继续拆分,所以我们称为基本数据类型。
六:结构体也可以包含其他结构体。


3——结构体变量

前面说到,结构体是一种数据类型,那么他就可以创建变量。
例如:

struct stu stu1,stu2;

注释:创建了stu1与stu2两个变量类型stu,这两个变量中都由结构体创建时成员组成。(可以把stu看成时一本书,定义出来的变量就像其中的句子,都是这本书中摘出来的,所以性质相同。
也可以再创建结构体时同时创建结构体变量。

例如:

struct stu
{
	char name;
	int money;
}s1,s2;

注释:同时想创建s1与s2结构体变量,放在结构体最后即可,如果后面不再需要创建结构体变量也可以省去结构体名stu。

4——结构体的存储

结构体再内存中的存储形式是存在内存对齐的。

内存对齐:
1.结构体的第一个成员在与结构体变量偏移量为0的地址处。
2.其他成员变量要对其到’对齐数’(对齐数:编译器默认的一个对齐数与成员大小的较小值,编译器不同默认对齐数也不同)的整数倍的地址。
3.总大小为最大对齐数的整数倍。
4.如果有嵌套结构体的情况,嵌套的结构体对齐本身最大对齐数的整数倍,结构体整体大小在计算时也要那出嵌套结构体中的最大对齐数来进行比较。

为什么存在这么复杂的内存对齐呢。答案就是:用空间换取时间。

offsetof:这个宏可以计算结构体成员的偏移量。
例如:

#offsetof(struct stu,name);

5——成员的获取与赋值

用’.'来直接访问赋值。
也可以在定义时整体赋值(仅此)。
使用时只能单独赋值。

6——位段

结构体实现位段。

1.位段成员必须时int,unsigned int ,char,signed int 类型。
2.位段成员名的后面有一个’:'冒号和一个数字;

例如:

struct stu
{
	int a:2;
	int b:5;
};

注释:冒号后面的数字决定该成员所占的位数,a限制位2个比特位,b限制位5个比特位。

7——位段的存储

1.相邻两个成员类型相同且相加之和小于该类型的sizeof计算的大小,会紧邻存放,如果大于,后面的成员会在新的存储单元开始。
2.当相邻类型不同,不同编译器不同方案,GCC会压缩存储,VS和VC则不会。
3.如果相邻成员之间穿插非位域成员,不会压缩存储。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值