结构
定义
由于多种内建数据类型组合成的一个整体,用于描述一个事物的各项数据。
通常通过struct定义称为结构体,设计如下:
struct TypeName
{
类型 成员名;
…
};
struct
32个关键字之一 ,数据类型结构体声明,由若干成员组成,成员也需要对类型声明。
TypeName
结构体名字,结构体使用时的标识符
注意:
此时只是完成了数据类型的设计。
使用时相同的结构体变量可以直接赋值。
结构体类型重定义:
由于在c语言中 struct 关键字无法省略, 导致使用时麻烦, 可以使用typedef给结构重定义类型。
typedef struct TypeName
{
…
}TypeName2;
TypeName2 即可代表 struct+标识符
结构体的使用
初始化成员
按照成员的顺序进行初始化。
struct TypeName 结构变量名 ={ 数据1,数据2 ,...};
无视顺序初始化(必须加上成员名)
struct TypeName 结构变量名 ={
.成员名 = 数据1,
.成员名 = 数据2,
...
};。
访问成员:
结构变量.成员名;
结构指针->成员名;
结构体的字节计算:
系统为了快速的访问结构的成员,会对结构的成员在排列时进行对齐和补齐,因此结构的成员顺序会影响结构的总字节数,一般结构的总字节数会 >=所有成员的字节数和。
对齐:
假定第一个成员使用0地址,所有成员所使用的内存地址必须能被它的字节数整除,如果不能则补充空字节。
补齐:
结构的总字节数必须是它最大成员的字节数的整数倍,如果不是则补充空字节。
注意:
linux系统在计算对齐、补齐时,成员的字节数超过4 也按4算
联合
是一种由程序员设计的一种数据类型,使用语法与结构一样,只是成员的排列方式不同,所有成员共用一块内存,一个成员的值发生变化,其他成员的值也会发生变化。
它可以用一块内存对应多个标识符,达到节约内存的目的,现在已经基本不用
union TypeName
{
类型 成员名;
…
};
联合的考点:
1、成员天然是对齐的,但是由内存补齐。
2、使用联合判断大小端系统?
系统大小端:
小端:低位数据存储在低位地址;
大端:低位数据存储在高位地址。
一般个人计算机使用的是小端系统,大端服务器、网络设备使用的是大端,大端字节序也叫网络字节序
枚举
枚举是一种特殊的整型数据,它是把一个整型数据可能出现的值全部罗列出来并取一个有意义的名字(枚举值),除此之外不因该再使用其它的值,以此保证数据的安全性。以及程序的可读性。
注意:编译器为了速度,不会检查枚举变量的赋值。
枚举值默认从零开始,枚举值在不指定值的情况下,第一个默认为0,之后逐渐加1,也可单个指定。
enum Direction{Up,Down,Left,Rightd};
枚举值是常量可以使用在case语句的后面。,不用再写字面值常量,从而提高程序可读性。也可定义匿名枚举,只使用枚举值