c语言-自定义类型

c语言-自定义类型 结构体, 枚举, 联合结构体struct Stu//结构体声明(可以使用不完全的声明) { char name[20];//名字 int age;//年龄 char sex[5];//性别 char id[20];//学号 }//分号不能丢结构体自引用的正确方式:struct node { int date; struct node* next;//一定要注意加* }; int main() { printf(%d\n, sizeof(struct node));//8 system(pause); return 0; }结构体定义变量和初始化:struct point { int x; int y; }p1 {1,1};//定义结构体变量p1//嵌套初始化 int main() { struct point p2;//定义结构体变量p2 struct point p3 {1,1};//初始化 } struct student {//类型声明 char name[100]; int age; }; int main() { struct student s { libai,33 };//初始化 printf(%d\n, s.age); system(pause); return 0; }结构体内存对齐:首先是如何计算结构体内存:对齐规则如下:1.第一个成员在与结构体变量偏移量为0的地址处(也就是说从0位开始存放);2.其他成员变量要对齐到某个数字的整数倍地址数,对齐数 编译器默认的一个对齐数与该成员大小的较小值.(vs默认数是8,但是莫人数也可以自己修改,使用#pragma pack(8)来设置默认对齐数为8);3.结构体总大小为最大对齐数的整数倍,(每个成员变量都有自己的对齐数);4.如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍;struct s1 { char c1; int i; char c2; }; int main() { printf(%d\n, sizeof(struct s1));//12 system(pause); return 0; }struct s1 { char c1; int i; char c2; }; int main() { printf(%d\n, sizeof(struct s1));//12 system(pause); return 0; }代码解析如下图:struct s1 { char c1; char c2; int i; }; int main() { printf(%d\n, sizeof(struct s1));//8 system(pause); return 0; }枚举枚举就是把可能的值进行一一列举;例如:enumDay{//星期mon,tues,wed,thur,fri,sat,sun};为什么使用枚举我们可以使用 #define 定义常量为什么非要使用枚举 枚举的优点增加代码的可读性和可维护性和#define定义的标识符比较枚举有类型检查更加严谨。防止了命名污染封装便于调试使用方便一次可以定义多个常量联合联合也是一种特殊的自定义类型,这种类型定义的变量也包括一系列的成员,特征是这些成员公用同一块空间(所以联合也叫共用体).联合的成员是共用同一块内存空间的这样一个联合变量的大小至少是最大成员的大小因为联合至少得有能力保存最大的那个成员。联合大小的计算:1.联合的大小至少是最大成员的大小2.当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍.例如:unionUn1{charc[5];inti;};unionUn2{shortc[7];inti;};intmain(){printf(%d\n,sizeof(unionUn1));//8printf(%d\n,sizeof(unionUn2));//16system(pause);return0;}