#define _CRT_SECURE_NO_WARNINGS 1
自定义类型:结构体、枚举、联合体
#pragma pack(8)//设置默认对齐数(可以减小减小浪费空间) struct stu//struct结构体类型,str结构体标签 struct //没有stu叫匿名结构体类型
struct
{ int a; char c; }sa;//这样写结构体变量也可以使用
int main() {
//struct
//{
// int a;
// char c;
//}; sa;
//struct
//{
// int a;
// char c;
//}; *psa;
//int main()
//{
// psa = &sa;//结构体成员变量相同,但类型标签不同时,系统默认内容不同,所以不能运行
//}//编译器会把上面的俩个声明当成完全不同的两个类型,所以是非法的
//struct Node
//{
// int data;//4字节 数据域
// struct Node* next;//4/8字节 指针域
//};
//结构体的自引用;
// struct Node
//{
// int data;
// struct Node next;
//};
//正确的自引用方式;
// struct Node
//{
// int data;
// struct Node* next;//可以放地址
//};
//typedef struct Node//这里的node不能去,否则下面的指针不能用
//{
// int data;//4
// struct Node *next;
//} Node;//类型名,不是变量名
//struct Node n1;
//结构体初始化和定义
// struct S
//{
// char c;
// int a;
// double d;
// char arr[20];
//};
//int main()
//{
//struct S s = { 'c',100,3.14,"hello bit" };
//printf("%c %d %lf %s\n", s.c, s.a, s.d, s.arr);
//}
//struct T
//{
// double weight;
// short age;
//};
//struct S
//{
// char c;
// struct T st;//结构体里面放结构体
// int a;
// double d;
// char arr[20];
//};
//int main()
//{
// struct S s = { 'c',{55.6,30}, 100,3.14,"hello bit" }
//}
//结构体内存对齐
// struct s1
//{
// char c1;
// int a;
// char c2;
//};
//struct s1
//{
// char c1;
// int a;
// char c2;
//};
//int main()
//{
//1.第一个成员在与结构体变量偏移量为0的地址处;
// 2.其它成员变量要对齐到某个数字(对齐数)的整数倍的地址处
// 对齐数=编译器默认的一个对齐数与该成员大小的较小值//对齐数默认是8
// 3结构体总大小为最大对齐数(每个成员变量都有1个对齐数)的整数倍
// 4.如果嵌套了结构体的情况,嵌套的结构体对齐到自己最大对齐数的整数倍处,结构体的整体大小
// 就是所有最大对齐数与该成员大小的较小值。
// struct S1 s1 = { 0 };
// printf("%d\n", sizeof(s1));//12
// struct S2 s2 = { 0 };
// printf("%d\n", sizeof(s1));//8//结构体计算大小规则
//}
//struct s3; //{ // double d; // char c; // int i; //}//16 // //struct s4;//32 //{ // char c1; // struct S3 s3;//自己的最大对齐数为8,所以对齐到16开始放(浪费7个后,开始放) // double d;//从24开始放,不浪费 //}//32
//为什么存在内存对齐 //1.某些硬件平台只能在某些特定地址取某些特定类型的数据 //2.性能原因 //总结 是拿空间换时间的做法 // //printf("%d\n", offsetof(struct s, c));//offsetof 可以计算出偏移量的大小 //这里的offsetof是一个宏,不是函数
//void Init(struct S tmp)//传值不能改变原函数内容 //{ // tmp.a = 100; // tmp.c = 'w'; // tmp.d = 3.14; //} // //void Init(struct S *ps)//传地址能改变原函数内容 //{ // tmp.a = 100; // tmp.c = 'w'; // tmp.d = 3.14; //} // //void print1(struct S tmp)//只能打印 //{ // printf("%d %c %lf\n", tmp.a, tmp.c, tmp.d); //} // //void print1(struct S *ps)//可以打印,也可以改变 //{ // printf("%d %c %lf\n", ps.a, ps.c, ps.d); //} // //struct S s{0}; //Init(s); //Init(&s); //print1(s); //print2(&s);
return 0;
}