#include<stdio.h>
//自定义类型:结构体,枚举,联合
//结构体变量
//struct Stu//struct是关键字 Stu是标签
//{
// char name[20];
// char tele[12];
// char sex[10];
// int age;
//}s3,s4,s5;//全局变量
//struct Stu s2;//全局变量
匿名结构体变量--省略tab
//struct
//{
// char name[20];
// int age;
//}x;
//struct
//{
// char name[20];
// int age;
//}*psa;
//结构体的自引用--在结构中包含一个类型为该结构本身的成员
//struct node
//{
// int data;
// struct node* next;//下一个的地址
//};
//重定义结构体
//typedef struct node
//{
// int data;
// struct node* next;
//}node;
//int main()
//{
// struct Stu s1;//局部变量
// //psa = &x;err,编译器会把上面的两个声明当成完全不同的两个类型,所以是非法
// struct node s2;
// node s3;
// return 0;
//}
//结构体的初始化
//struct T
//{
// double weight;
// int age;
//};
//struct S
//{
// char c;
// struct T st;
// int a;
// double d;
// char arr[20];
//};
//int main()
//{
// //初始化
// struct S s = { 'c',{55.3,30},100,3,14,"hello bit" };
// printf("%c %d %lf %s\n", s.c, s.a, s.d, s.arr);
// printf("%lf %d\n", s.st.weight, s.st.age);
// return 0;
//}
//struct s1
//{
// char c1;
// int a;
// char c2;
//};
//struct s2
//{
// char c1;
// char c2;
// int a;
//};
//struct s3
//{
// double d;
// char c;
// int i;
//};
//struct s4
//{
// char c1;
// struct s3 st1;
// double d;
//};
//结构体变量计算规则
//1.第一个成员在与结构体变量偏移量为0的地址处
//2.其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处
//对齐数=编译器默认的一个对齐数与该成员大小的较小值
//VS中 默认的值为8,gcc无默认值
//3.结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍
//4.如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小计算所有最大对齐数(汉嵌套结构体的对齐数)整数倍
//int main()
//{
// struct s1 st1 = { 0 };
// struct s2 st2 = { 0 };
// printf("%d %d %d %d\n",sizeof(st1), sizeof(st2),sizeof(struct s3),sizeof(struct s4));//12 8 16 32
//}
//修改默认对齐数
//设置默认对齐数为4
#pragma pack(4)
//struct s
//{
// char c1;//1
// double d;//8
//};
#pragma pack()
//取消设置的默认的对齐数
//int main()
//{
// struct s str;
// printf("%d\n", sizeof(str));//12
// return 0;
//}
//宏-offsetof--计算结构体成员变量的偏移量
#include <stddef.h>
//struct s
//{
// char c;
// int i;
// double d;
//};
//int main()
//{
// struct s str;
// printf("%d %d %d\n", offsetof(struct s, c),offsetof(struct s,i),offsetof(struct s,d));//0 4 8
//}
//写一个宏,计算结构体中某变量相对于首地址的偏移,并给出说明
//struct stu
//{
// char arr2[10];
// char c;
// int arr1[5];
//};
//int main()
//{
// struct stu s = { 0 };
// printf("%d %d %d\n", offsetof(struct stu, arr2), offsetof(struct stu, c), offsetof(struct stu, arr1));//0 10 12
// return 0;
//}
//结构体传参一要传结构体的地址,省空间
struct s
{
int a;
char b;
double d;
};
//初始化函数
void Init(struct s* s1)
{
s1->a = 100;
s1->b = 'w';
s1->d = 3.14;
}
//传值
void print1(struct s s1)
{
printf("%d %c %lf\n", s1.a, s1.b, s1.d);
}
//传址,更加好点
void print2(struct s* s1)
{
printf("%d %c %lf\n", s1->a, s1->b, s1->d);
}
int main()
{
struct s s1 = { 0 };
Init(&s1);
print1(s1);
print2(&s1);
return 0;
}