[C]结构体
知识点:
>结构体类型创建struct a
{
int a;
int b;
int c;
};
>结构体初始化 struct point
{
int x;
int y;
}p1;
struct point p2;
struct Stu
{
char name[20];
int age;
};
struct Stu s ={"dsa",20};
>结构体内存对齐
结构体内存对齐:元素是按照定义顺序一个一个放到内存中去的,但并不是紧密排列的。从结构体存储的首地址开始,每个元素放置到内存中时,它都会认为内存是按照自己的大小来划分的,因此元素放置的位置一定会在自己宽度的整数倍上开始。
方法:
a、从零偏移处开始,按字节大小计算,判断此偏移地址是否为该成员变量和对齐参数两者之间的最小值,即min(对齐参数,sizeof()成员);
b、若是,则从此处开始占用内存,大小为该类型所占字节数值,若不是,则内存向后偏移到最小值整数倍处,再开始占用空间。
c、按a、b、两步骤算出结构体实际所占内存时,为了方便后面类型的存储,再向后偏移一位,然后判断该地址是否是默认对齐数与该结构体中最大类型所占字节数的最小值 ,即:min(默认对齐参数,类型最大字节数)的整数倍,若是,则当前偏移地址的字节数便是结构体大小,若不是,继续向后偏移,直至为最小值整数倍为止。
>位段,位段计算机大小。
跟结构相比,位段可以达到同样的效果,但是可以很好的节省空间,但是有跨平台的问题存在。
>枚举+联合。
说了结构体,就不得不说联合和枚举。
联合这个类型的设计就是为了节省内存,联合内的元素共用一段存储空间,空间大小由最大的数据元素决定。联合空间只有一个最新赋值的成员值有效。一句话总结:空间共享,后来为主。
联合的定义跟结构一样,也有3种方式“:
union UNI
{
char ch;
float x;
};
union UNI u;
或
typedef union UNI
{
char ch;
float x;
}UNI;
UNI u;
或
typedef union
{
char ch;
float x;
}UNI;
UNI u;
联合变量u可以初始化,但只能初始化第一个成员,即不能对联合变量整体赋值。
枚举类型也是一种用户自定义类型,它允许用户定义有限个常量(注意是常量!),每个常量由用户自己的标识符来标示,这种类型更贴近处理实际问题,每个常量标识符都有确定的意义,增强代码的可读性。
枚举类型的定义与结构体、联合一样,
例:enum WEEKDAY {Sun,Mon,Tue,Wed,Thu,Fri,Sat};
enum WEEKDAY w;
给枚举变量赋值的一般是枚举元素,用常量表达式给枚举变量赋值时必须要强制类型转换,枚举元素是常量,不能作为左值!
w = mon; //枚举元素给枚举变量赋值
w = (enum WEEKDAY)6;// 常量表达式给枚举变量赋值
mon = (enum WEEKDAY)1;//非法
说了结构体,就不得不说联合和枚举。
联合这个类型的设计就是为了节省内存,联合内的元素共用一段存储空间,空间大小由最大的数据元素决定。联合空间只有一个最新赋值的成员值有效。一句话总结:空间共享,后来为主。
联合的定义跟结构一样,也有3种方式“:
union UNI
{
char ch;
float x;
};
union UNI u;
或
typedef union UNI
{
char ch;
float x;
}UNI;
UNI u;
或
typedef union
{
char ch;
float x;
}UNI;
UNI u;
联合变量u可以初始化,但只能初始化第一个成员,即不能对联合变量整体赋值。
枚举类型也是一种用户自定义类型,它允许用户定义有限个常量(注意是常量!),每个常量由用户自己的标识符来标示,这种类型更贴近处理实际问题,每个常量标识符都有确定的意义,增强代码的可读性。
枚举类型的定义与结构体、联合一样,
例:enum WEEKDAY {Sun,Mon,Tue,Wed,Thu,Fri,Sat};
enum WEEKDAY w;
给枚举变量赋值的一般是枚举元素,用常量表达式给枚举变量赋值时必须要强制类型转换,枚举元素是常量,不能作为左值!
w = mon; //枚举元素给枚举变量赋值
w = (enum WEEKDAY)6;// 常量表达式给枚举变量赋值
mon = (enum WEEKDAY)1;//非法