自定义类型:结构体,枚举,联合

时间:2020-12-24 16:09:08

结构体

结构体是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。

结构体声明:

 
struct student   //标签,可以省略但是尽量不要省略,方便阅读。
{
 char name[];    //结构体成员,c语言中不能为空
 int age;
 char sex[];
 char id[20];
}list;   //变量列表,可以省略。  注意切记不要忘记分号。

结构体成员访问:

1、结构体变量访问成员。

2、结构体指针访问成员。

 
struct student   
{
 char name[];    
 int age;
 char sex[];
 char id[20];
};   
struct student list;struct student *p;printf("%s",list.name);printf("%s",p->name);

结构体变量的定义和初始化:

结构体的定义和初始化很简单,可以类比数组的初始化。

struct student   
{
 char name[];    
 int age;
 char sex[];
 char id[20];
};   
struct student a={"zhangsan",20,"nan","001"}; //初始化

结构体内存对齐:

struct s1
	{
		char c1;
		int i;
		char c2;
	};
	printf("%d\n", sizeof(struct s1)); //我们发现结构体的大小不是6,所以结构体的大小不是简单的成员大小相加,而需要考虑内存对齐。

自定义类型:结构体,枚举,联合

内存对齐规则:1、第一个成员在与结构体偏移量为0的地址处。

                        2、其他成员变量要对齐到对齐数的整数倍的地址处。对齐数=编译器默认的对齐数与该成员大小的较小值。

                        3、结构体的总大小为对齐数的整数倍。

                        4、如果嵌套了结构体,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体大小就是所有最大对齐数的                                整数倍(包括嵌套结构体的对齐数)。

总的来说内存对齐就是拿空间换时间的做法。所以在设计结构体的时候,尽量将空间较小的成员放在一起。


结构体传参:

结构体传参时不会发生降维,如果传参时传递一个结构体对象,结构体过大,参数压栈的系统开销比较大,所以会导致性能下降。所以结构传参时,要传结构体地址。

位段:

位段与结构体类似,但位段的成员类型必须是int、unsigned int 、signed int 或char

struct A
{
 int _a:2;//只是用变量a的两个比特位
};

位段其实是压缩内存空间,用时间换空间,但是移植性较差。


枚举

枚举就是一一列举

enum Day//枚举的定义
{
 Mon;        //{}中的内容 是枚举类型的可能取值,叫枚举常量。致谢常量都是有取值的,默认从0开始,依次递增1.
 Tues;
 Wed;
 Thur;
 Fir;
 Sat;
 Sun;
};

优点:

1、增加代码可读性和可维护性。

2、枚举有类型检查,更加严谨。

3、防止命名污染(封装)。


联合:

联合是一种特殊的自定义类型,特征是这些成员公用同一块空间。

union Un   //联合类型声明
{
 char c;
 int a;        //联合的大小至少是最大成员的大小,且考虑内存对齐.
};
联合体的应用:求计算机是大端还是小端