#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> //联合体/共用体--------共用一块空间,空间至少是最大成员的大小 //联合体是一种特殊的自定义类型,这种类型定义的变量包含一系列的成员,特征是这些成员共用一块空间 //union un//创建联合体类型 //{ // char c;//1 // int i;//4 //}; //int main() //{ // union un u={10};//同一时间,联合体成员只能改其中的一个值 // u.i = 1000;//u.i和u.c只能有一个有效,因为共用一个空间 // u.c = 100; // printf("%d\n", sizeof(u));//4 // printf("%p\n", &u);//000000176572F8F4 // printf("%p\n", &(u.c));//000000176572F8F4 // printf("%p\n", &(u.i));//000000176572F8F4 // return 0; //} //判断当前计算机的大小端 //int check_sys()和check_sys2()是两种实现方法 //法一: int check_sys()//使用函数,并不进行打印,用返回值确定是大端还是小端,使之更加灵活 { int a = 0x11223344;//a是int型,4个字节,,0x11223344是十六进制,也是4个字节 //44是低位,11是高位, 在内存中,如果由低地址到高地址为11223344,则低位放在高地址,是大端存储 // 如果由低地址到高地址为44332211,则低位放在低地址,是小端存储 if ((*(char*)&a) = 4)//&a拿出地址,(char*)强制类型转换为char,*解引用.目的是拿出前两个字节 { return 1;//小端 } else { return 0;//大端 } } //法二: int check_sys2() { union U { char c; int i; }u;//在联合体里面创建个变量u u.i = 1; return u.c;//目的:在联合体 c i共用一个空间,而char正好是int的前四分之一部分,所以可以判断 } int main() { int ret=check_sys();//写函数的目的是让其更加独立! if (ret == 1) printf("小端\n");//小端---对照check_sys() else printf("大端\n"); int check_sys2(); if (ret == 1) printf("小端\n");//小端----对照check_sys2(); else printf("大端\n"); return 0; } //使用场景举例:学校里有老师和同学,老师同学都有性别,身高,爱好,职务等, //那么如何区分老师学生呢,此时用联合体,并把联合体放在第一个,其他放后,就能区分 //联合体大小的计算 //空间至少是最大成员的大小,当最大成员大小不是最大对齐数的整数倍的时候, //就要对齐到最大对齐数的整数倍 union Un { char a[5];//1----5 int i;//4----必须是最大对齐数4的倍数,且大于5,就是8 }; union Vn { short a[5];//2----10 int i;//4----必须是最大对齐数4的倍数,且大于10,就是12 }; int main() { union Un u; printf("%d\n", sizeof(u));//8 union Vn v; printf("%d\n", sizeof(v));//12 return 0; }