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