结构体

本文详细介绍了C语言中的结构体,包括结构体类型的设计、嵌套结构体、成员访问方式,以及结构体与数组的关系。重点讨论了字节对齐的概念,解释了其在内存读写效率和跨平台兼容性方面的重要性。此外,还提到了联合体(共用体)的特点,即成员共享内存空间。枚举类型作为受限的有符号整型,其使用规则和与常量、#define定义的区别也进行了阐述。
摘要由CSDN通过智能技术生成

结构体

1.结构体类型的设计

C语言提供了基本数据类型,如char,short,int,float…等类型,称之为内置类型。程序开发人员可以使用结构体来封装一些属性,设计出新的类型,在C语言中称为结构体类型。在C语言中,结构体是一种数据类型。也可以使用结构体来存放一组不同类型的数据。
结构体的定义形式为:
struct 结构体名
{
成员列表(可以是基本数据类型,指针,数组或其他类型结构)
};

*结构体是一种数据类型,是创建变量的模板,不占用内存空间;结构体变量才包含了实实在在的数据,需要存储空间。

2.结构体嵌套结构体

3.结构体成员访问

3.1 对结构变量整体赋值有三种情况
(1)定义结构体变量(用{}初始化)
(2)用已定义的结构变量初始化
(3)结构体类型相同的变量可以作为整体相互赋值

*其他情况的使用过程中只能对成员逐一赋值,在C语言中不存在对结构体类型的强制转换(和内置类型的区别)。
3.2 结构体变量和指针
内置类型能够定义指针变量,结构体类型也可以定义结构体类型指针。
结构体类型指针访问成员变量的获值和赋值形式:
(*p).成员名(.的优先级高于 *,(*p)两边的括号不能少) //*p.xx;

p ->成员名(-> 是 减号加大于号,中间没有空格,称为指向符)

4.结构体与数组

结构体数组是指数组中的每个元素都是一个结构体类型。在实际应用中,C语言结构体数组常被用来表示一个拥有相同数据结构的群体。

*由于储存变量地址对齐问题,计算结构体大小的3条规则:
1.结构体变量的首地址,必须是结构体变量中的"最大基本数据类型成员所占字节数"的整数倍。
2.结构体变量中的每个成员相对于结构体首地址的偏移量,都是该成员基本数据类型所占字节的整数倍。
3.结构体变量的总大小,为结构体变量中"最大基本数据类型成员所占字节数"的整数倍。

5.为什么要理解字节对齐问题

(1)内存大小的基本单位是字节(byte),理论上来讲,可以从任意地址访问变量,但实际上,CPU并非逐字节读写内存,而是以2,4或8的倍数的字节块来读写内存,因此就会对基本数据类型的地址做出一些限制,即它的地址必须是2,4或8的倍数。那么就要求各种数据类型按照一定的规则在空间上排列,这就是对齐。
(2)有些平台每次读都是从偶地址开始,如果一个int型(假设为32位系统)如果存放在偶地址开始的地方,那么一个读周期就可以读出这32bit,而如果存放在奇地址开始的地方,就需要两个读周期,并对两次读出的结果的高低字节进行拼凑才能得到该32bit数据。显然在读效率上下降了很多。
(3)由于不同平台对齐方式可能不同,如此一来,同样的结构在不同平台其大小可能不同,在无意识的情况下,互相发送的数据可能出现错乱,甚至引发严重的问题。

*(1)结构体变量的首地址,必须是MIN{“结构体最大基本数据类型成员所占字节数”,指定对齐方式}大小的整数倍。
*(2)结构体每个成员相对于结构体首地址的偏移量,都是MIN{基本数据类型成员,指定对齐方式}大小的整数倍。
*(3)结构体的总大小,为MIN{结构体"最大基本数据类型成员所占字节数"(将嵌套结构体里的基本类型也算上,得出最大基本数据类型成员所占字节数),指定对齐方式}大小的整数倍。

6.联合体(共用体)

联合体与结构体有相似之处。但两者有本质上的不同。在结构体中,各成员有各自的内存空间。而在联合体中,各成员共享同一段内存空间,一个联合变量的长度等于个成员中最长的长度。
说明:共享不是指把多个成员同时装入一个联合变量内,而是指该联合变量可被赋予任一成员值,但每次只能赋一种值,赋入新值则冲去旧值。
一个联合体类型必须经过定义之后才能使用它,才能把一个变量声明定义为该联合体类型。
在这里插入图片描述


在这里插入图片描述

枚举

就是一一列举,把需要的取值一一列举。
特点:枚举类型是收到限制的有符号整型类型,枚举值必须是整型类型(有符号);枚举变量的取值范围必须是枚举值集合。
在这里插入图片描述
定义枚举变量 enum week x = Mon;
1.取值只能赋值为{枚举值集合中值};
2.枚举变量不能++或–;
枚举与常变量,#define 定义常量的区别
1.增加代码的可读性和可维护性
2.和#define定义的标识符比较,枚举有类型检查,更加严谨。
3.封装性好。
4.便于调试。
5.使用方便,一次可以定义多个常量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值