结构:
结构是由程序员自己设计的数据类型,用于描述一个事物的各项数据,由若干个基础类型组成
设计:
typedef struct 结构体名
{
类型1 成员名1;
类型2 成员名2;
...
}新名字;
typedef struct Teacher Teacher;
定义结构变量:
struct 结构体名 变量名;
注意:在定义结构变量时struct不能省略
结构体变量初始化:
struct 结构体名 变量名={v1,v2...};
注意:必须要根据成员设计的顺序初始化,初始化省略只能从后面开始,不能直接省略中间的
struct 结构体名 变量名={.成员名1=v1,.成员名3=v3,...}
只初始化某些成员,可以不用按顺序初始化
struct Student stu1=stu2; 同类型的结构体变量可以直接给结构体变量初始化丶赋值
访问成员:
变量名.成员名
结构指针->成员名
结构变量作为形参时:结构体字节数较大,值传递效率低,传指针效率高,不需要改值加const保护
练习1:设计一个教师结构体,成员有姓名 性别 工号 工龄 定义一个教师结构体变量,使用scanf输入各个成员的值并显示
注意:结构体变量一般较大,最好存在堆内存
如何计算结构体的字节数:
结构体成员的顺序会影响总字节数
内存对齐:假定第一个成员从0开始,存储每个成员的地址编号必须满足能被该成员字节数整除,不能则补空白字节
内存补齐:结构体的总字节数要求必须是最大成员的字节数(在linux系统下最大字节数超过4字节按4字节算,但windows下多大就多大)的整数倍,如果不是则在末尾填充空白字节
linux下 #pragma pack(n) 最大字节超过n按n算,只能放1,2,4(因为n要小于等于4)
windows下 该宏定义没用?
联合:union 使用少量内存对应多个标识符来节约内存,现在基本不用(没有内存对齐,有内存补齐)
联合与结构的使用方法基本一致,区别在于所有成员公用一块内存,一个成员的值发生改变,其他成员也会跟着改变
union Data
{
char ch[5];
int num;
};
字节数为8
如何判断操作系统的大小端(高位数据存低位地址为大端,反之)
个人计算机系统一般都是小端系统,unix服务器和网络设备都是大端系统
本地字节序是小端模式,网络字节序是大端模式
序列化(上传时将小端转成大端)和反序列化(网上下载时将大端转成小端)(json\xml)
枚举:enum 用处:给数值起一个有意义的名字,提高可读性,相对于宏常量安全性更高
枚举就是把一种数据类型可能出现的值全罗列出来,取一个有意义的名字,(除此之外的数据如果赋值给该枚举变量就是非法的)?
可以看做值受限的int类型,c编译器为了效率不检查,所以c语言的枚举变量可以当int类型变量使用,一般会直接使用起好名字的枚举成员
enum Direction
{
UP=183,
DOWN=184,
RIGHT=185,
LEFT=186,
};
enum Direction key=UP;
UP=100;报错,不可更改
enum d
{
a,b,c
};
则abc分别为0 1 2
enum d
{
a=5,b,c
};
则abc分别为5 6 7
enum d
{
a,b=5,c
};
则abc分别为0 5 6
全局变量初始化时不能调用函数
int* p=malloc(40) 错误