//struct {
// char name[20];
// int no;
// float score;
//}a, c;
//int main()
//{
// struct student b;//没有student不能用b
//}
//struct student{
// char name[20];
// int no;
// float score;
//}a = { "liming",10110,86.5 }, c;
//int main()
//{
// struct student b;
// //scanf("%s%d%f", b.name, &b.no, &b.score);//数组名不需要加&
// //printf("%s %d %lf", b.name, b.no, b.score);
// //c.name = "liming";//因为name是数组名,不能直接将字符串赋值给他
// strcpy(c.name, "liming");
// c.no = 10110;
// c.score = 86.5;
// printf("%s %d %lf", c.name, c.no, c.score);
// printf("\n");
// printf("%d", sizeof(struct student));
//}
//struct student {
// int no;
// char name[20];
// float score;
//}c;
//int main()
//{
// struct student b;
// //scanf("%s%d%f", b.name, &b.no, &b.score);//数组名不需要加&
// //printf("%s %d %lf", b.name, b.no, b.score);
// //c.name = "liming";//因为name是数组名,不能直接将字符串赋值给他
// strcpy(c.name, "liming");
// c.no = 10110;
// c.score = 86.5;
// printf("%s %d %lf", c.name, c.no, c.score);
// printf("\n");
// printf("%d", sizeof(struct student));
//}
//结构体的内存对齐问题
//成员变量的对齐书等于编译器默认对齐数与成员变量大小的最小值
//第一个成员变量对齐到结构体变量起始位置偏移量为0的地址
//结构体大小为最大对齐数的整数位以下举例就是4的倍数
// (4)如果嵌套了结构体成员,嵌套的结构体成员数是其自身最大成员数的整数倍
//a占0-3位,因为char只占1个字节,123就空着,b从4开始,存放4567,c从8开始一直存到11,0-11加起来一共是4的倍数12;
//struct student {
// char a;
// int b;
// char c;
//
//};
//int main() {
// printf("%d", sizeof(struct student));
//}
//struct student {
// char a;
// char c;
// int b;
//
//};
//int main() {
// printf("%d", sizeof(struct student));//char a有一位,占0,1,1空着;char c有一位,占2,3,3空着,int有四位4567,没有空
// //所占字节数按照有效字节数的倍数算,字节为4的时候,int4个字节就放满了,char a,char b不够放
// //所以当为4的倍数8的时候,够存放三个类型
//}
//struct s1 {
// char a;
// int b;
// char c;
//
//};
//struct s2 {
// char a;
// char c;
// int b;
//
//};//8
//
//struct s3 {
// double a;
// char c;
// int b;
//};//16
//struct s4 {
// char a;
// struct s3 b;//b从8开始到23
// double c;
//};//32
//struct s5 {
// char a;
// struct s2 b;//b从8开始到23
// double c;
//};
//
//int main() {
// printf("%d\n", sizeof(struct s4));
// printf("%d\n", sizeof(struct s5));
//}
//struct student {
// char name[20];
// int no;
// float score;
// }stu[3];
// int main()
// {
// int i;
// for (i = 0; i < 3; i++)
// {
// scanf("%s%d%f", stu[i].name, &stu[i].no, &stu[i].score);
// }
// for (i = 0; i < 3; i++)
// {
// printf("%s %d %f", stu[i].name,stu[i].no,stu[i].score);
// printf("\n");
// }
//
// }
//结构体指针
//struct student {
// char name[20];
// int no;
// float score;
//}stu[3];
//int main()
//{
//
//
// int i;
// for (i = 0; i < 3; i++)
// {
// scanf("%s%d%f", stu[i].name, &stu[i].no, &stu[i].score);
// }
// struct student* p = &stu;
// for (i = 0; i < 3; i++)
// {
// printf("%s %d %f", (*p).name, (*p).no, (*p).score);
// printf("\n");
// }
//
//}
//struct student {
// char name[20];
// int no;
// float score;
//}stu[3];
//int main()
//{
//
//
// int i;
// for (i = 0; i < 3; i++)
// {
// scanf("%s%d%f", stu[i].name, &stu[i].no, &stu[i].score);
// }
// struct student* p = &stu;
// for (i = 0; i < 3; i++)
// {
// printf("%s %d %f", (*(p + i)).name, (*(p + i)).no, (*(p + i)).score);
// printf("\n");
// }
// for (p=stu;p<stu+3;p++)
// {
// printf("%s %d %f", p->name, p->no, p->score);
// printf("\n");
// }
// for (p = stu; p < stu + 3; p++)
// {
// printf("%s %d %f", (*p).name, (*p).no, (*p).score);
// printf("\n");
// }
//
//}
//struct student {
// char name[20];
// int no;
// float score;
//}stu[3];
//void fun(struct student*p)
//{
// if ((*p).score > ((*(p + 1)).score))
// {
// if ((*p).score > ((*(p + 2)).score))
// {
// printf("%s %d %f", (*p).name, (*p).no, (*p).score);
// }
// else if ((*p).score < ((*(p + 2)).score))
// {
// printf("%s %d %f", (*(p + 2)).name, (*(p + 2)).no, (*(p + 2)).score);
// }
// }
// else if (((*(p + 1)).score)>(*p).score)
// {
// if ((*(p + 1)).score > ((*(p + 2)).score))
// {
// printf("%s %d %f", (*(p+1)).name, (*(p + 1)).no, (*(p + 1)).score);
// }
// else if ((*(p + 1)).score < ((*(p + 2)).score))
// {
// printf("%s %d %f", (*(p + 2)).name, (*(p + 2)).no, (*(p + 2)).score);
// }
// }
//}
//int main()
//{
// struct student* p = &stu;
// int i;
// for (i = 0; i < 3; i++)
// {
// scanf("%s%d%f", stu[i].name, &stu[i].no, &stu[i].score);
// }
//
// fun(p);
//}
//共用体
//union a {
// int a;
// int b;
// char c;
//}b = { 'a' };//对于联合体来说,在某一时间只能有一个变量给他赋值
//int main() {
// union a c;
// printf("%p\n",&c);
// printf("%p\n", &c.a);
// printf("%p\n", &c.b);
// printf("%p\n", &c.c);
// printf("%d\n", sizeof(c));//这个共用体内存空间是以他最大类型成员所占空间为主
// printf("%c\n", b);//b='a'->a;b=23->23;
// c.a = 12;
// c.b = 65;
// printf("%d\n", c.a);
// printf("%d\n", c.b);
// printf("%c\n", c.c);//以每次最后一个赋值为主
//
//
//}
//枚举类型
//enum a { monday, tuesday, wednesday, thursday=5, friday, saturday, sunday }b;//它的变量取值范围是有限的,枚举元素
//int main()
//{
// printf("%d\n", wednesday);
// b = friday;
// printf("%d\n", b);//如果将Thursday改变成5,在他之前的数值不变,从他开始 以后都改变
//
//}
//int main()
//{
// union {
// int a, b;
// struct {
// int n,m,h;//与结构体内的变量顺序有关系,哪个在第一个,struct外的变量,就和那个占用一个地址
// }k;
// int a;
// }e;
// e.a = 1;
// e.b = 2;
// e.k.m = e.a * e.b;//2*2
// e.k.n = e.a + e.b;//4+4
// e.k.h = e.a - e.b;
//
// printf("%d,%d,%d", e.k.m, e.k.n,e.k.h,e.);
//}
int main()
{
union {
int a[3];
long k;
char c[4];
}r,*s=&r;
s->a[0] = 0x39;
s->a[1] = 0x38;
printf("%x\n", s->c[0]);//0x39先分配给a[0],0x38分配给a[1],
//小端存储:将低字节数存放低地址处
//因为第一个元素int型有四个字节,将x39分配给
//第一行就是x39,剩下就自动分配0
printf("%x\n", s->c[1]);
printf("%x\n", s->c[2]);
printf("%x\n", s->c[3]);
}