#include<stdio.h>
//联合类型的声明
union U
{
char C;
int i;
};
int main()
{
//联合变量的定义
union U u = { 0 };
//计算连个变量的大小
printf("%d\n", sizeof(u));
return 0;
}
结果为什么是4呢?
我们来看联合体的特点
#include<stdio.h>
//联合类型的声明
union U
{
char C;
int i;
};
int main()
{
//联合变量的定义
union U u = { 0 };
//计算连个变量的大小
printf("%d\n", sizeof(u));
printf("%p\n", &u);
printf("%p\n", &(u.i));
printf("%p\n", &(u.C));
return 0;
}
我们看到,联合体u的地址和C的地址i的地址是一样的。共用同一块空间。
看第二个代码
#include<stdio.h>
//联合类型的声明
union Un
{
char c;
int i;
};
int main()
{
//联合变量的定义
union Un un = { 0 };
un.i = 0x11223344;
un.c = 0x55;
printf("%x\n", un.i);
return 0;
}
#include <stdio.h>
struct S
{
char c;
int i;
};
int main()
{
struct S s = { 0 };
printf("%d\n",sizeof(struct S));
return 0;
}
我们再来看联合体的
#include <stdio.h>
union Un
{
char c;
int i;
};
int main()
{
union Un un = { 0 };
printf("%d\n", sizeof(union Un));
}
结构体在内存中的存储可看
#include<stdio.h>
union Un1
{
char c[5];//5 1 8 1
int i;//4 4 8 4
};
union Un2
{
short c[7];//14 2 8 2
int i;//4 4 8 4
};
int main()
{
//下面输出的结果是什么?
printf("%d\n", sizeof(union Un1));//8
printf("%d\n", sizeof(union Un2));//16
return 0;
}
union Un1
{
char c[5];//5 1 8 1
int i;//4 4 8 4
};
Un1中最大成员是c 占五个字节,但不是最大对齐数 4的倍数所以就要对齐到8.
union Un2
{
short c[7];//14 2 8 2
int i;//4 4 8 4
};
Un2中最大成员是c占14个字节,但不是最大对齐数4的字节,所以要对其到16.
所以联合体的大小,是其中最大成员的大小 (这句话是错误的)。
#include <stdio.h>
struct gift_list
{
//公共属性
int stock_number;//库存量
double price;//定价
int item_type;//商品类型
//特殊类型
char title[20]; // 书名
char author[20];//作者
int num_pages;//页数
char design[30];//设计
int colors;//颜色
int sizes;//尺寸
};
struct gift_list
{
int stock_number;//库存量
double price; //定价
int item_type;//商品类型
union {
struct
{
char title[20];//书名
char author[20];//作者
int num_pages;//页数
}book;
struct
{
char design[30];//设计
}mug;
struct
{
char design[30];//设计
int colors;//颜色
int sizes;//尺寸
}shirt;
}item;
};
#include <stdio.h>
int main()
{
int a = 1;
if (*(char*)&a == 1)
{
printf("小端\n");
}
else
{
printf("大端\n");
}
return 0;
}
vs是小端
#include <stdio.h>
int main()
{
union
{
char c;
int i;
}u;
u.i = 1;
if (u.c == 1)
printf("小端\n");
else
printf("大端\n");
return 0;
}
我们也可以写成函数
#include <stdio.h>
int check_sys()
{
union
{
char c;
int i;
}u;
u.i = 1;
return u.c;
}
int main()
{
if (u.c == 1)
printf("小端\n");
else
printf("大端\n");
return 0;
}
#include <stdio.h>
enum Day
{
Mon,//0
Tues,//1
Wed,//2
Thur,//3
Fri,//4
Sat,//5
Sun//6
};
enum Sex//性别
{
MALE,//0
FEMALE,//1
SECRET//2
};
int main()
{
printf("%d %d %d %d %d %d %d\n", Mon, Tues, Wed, Thur, Fri, Sat, Sun);
printf("%d %d %d\n", MALE, FEMALE, SECRET);
return 0;
}
enum Day
{
//列出的是枚举类型的可能取值
//这些列出的可能取值被称为:枚举常量
Mon,//0
Tues,//1
Wed,//2
Thur,//3
Fri,
Sat,
Sun
};
enum Sex
{
MALE=4,//0
FEMALE=7,//1
SECRET=1//2
};
int main()
{
//printf("%d %d %d %d %d %d %d\n", Mon,Tues,Wed,Thur,Fri,Sat,Sun);
printf("%d %d %d\n", MALE, FEMALE, SECRET);
//MALE = 4;//ERR
enum Sex s = MALE;
enum Day d = Sun;
return 0;
#include <stdio.h>
void menu()
{
printf("*********************\n");
printf("*** 1.add 2.sub ***\n");
printf("*** 3.mul 4.div ***\n");
printf("*** 0.exit ***\n");
printf("*********************\n");
}
enum Option
{
EXIT,
ADD,
SUB,
MUL,
DIV
};
//#define EXIT 0
//#define ADD 1
//#define SUB 2
//
//#define XOR 5
int main()
{
int input = 0;
do
{
menu();
printf("请选择:");
scanf("%d", &input);
switch (input)
{
case ADD:
break;
case MUL:
break;
default:
break;
}
} while (input);
return 0;
}
#include <stdio.h>
enum Color//颜色
{
RED = 1,
GREEN = 2,
BLUE = 4
};
int main()
{
enum Color clr = GREEN;//使用枚举常量给枚举变量赋值
enum Color clr2 = 2;
printf("%d\n", sizeof(clr));//4
return 0;
}