一、共用体
1.共用体中的所有成员,共享一片内存空间,成员的首地址都相同
2.共用体的大小,取决于共用体中成员大小更大的那个
3.一个成员的数据发生修改,另一个会跟着修改
1.定义
把定义结构体时的struct改成union即可
访问共用体成员与访问结构体成员类似。 变量用.访问,指针用->访问
cs
union A
{
int a;
char c;
}; //声明共用体类型
union A a1; //定义了一个共用体变量
2.大小端存储(字节序问题)
小端存储:地址低位存数据低位 (常见的计算机都是小端存储)
大端存储:地址地位存数据高位 (网络通信的数据包一般是大字节序)
2.1使用共同体判断字节序问题
cs
#include <stdio.h>
union A
{
char t1;
int t2;
};
int main(int argc, const char *argv[])
{
union A a1; //栈区
a1.t2 = 0x12345678; //0x12数据高位 0x78数据低位
printf("%#X\n",a1.t1); //访问共用体中的地址低位
printf("%p\n",&a1.t1);
printf("%p\n",&a1.t1+3);
return 0;
}
2.2使用指针判断字节序问题
cs
#include <stdio.h>
int main(int argc, const char *argv[])
{
int a = 0x12345678;
char *p = &a; //为了只取a的低地址的数据
if(*p==0x78)
{
printf("小端\n");
}
else
{
printf("大端\n");
}
return 0;
}
二、枚举(enum)
1.定义
cs
enum 枚举名
{
枚举项1,
枚举项2,
枚举项3,
···
枚举项n,
}; --->使用enum 枚举名 定义变量
typedef enum 枚举名
{
枚举项1,
枚举项2,
枚举项3,
···
枚举项n,
}新的枚举名; ---->使用新的枚举名定义变量
2.举例
cs
#include <stdio.h>
enum week
{
Sun,
Mon,
Tue,
Wed=6,
Thu,
Fri,
Sat,
};
int main(int argc, const char *argv[])
{
int a = Sun;
//Sun = 90; 枚举项不能被赋值
printf("%d\n",a);
printf("%d\n",Mon);
printf("%d\n",Tue);
printf("%d\n",Sat);
return 0;
}
3.使用场景
3.1
cs
#include <stdio.h>
enum week
{
Sun,
Mon,
Tue,
Wed,
Thu,
Fri,
Sat,
};
void week_p(enum week p)
{
switch(p)
{
case Sun:
printf("p是星期天\n");
break;
case Sat:
printf("p是星期六\n");
break;
case Mon:
printf("p是星期一\n");
break;
}
}
int main(int argc, const char *argv[])
{
week_p(Mon);
return 0;
}
3.2
cs
#include <stdio.h>
#include <string.h>
enum LED{
LED_1,
LED_2,
LED_3,
};
enum LED_CON{
LED_ON,
LED_OFF,
};
void inint(enum LED L){
switch(L){
case LED_1:
printf("LED_1初始化成功\n");
break;
case LED_2:
printf("LED_2初始化成功\n");
break;
case LED_3:
printf("LED_3初始化成功\n");
break;
}
}
void con(enum LED L,enum LED_CON C){
switch(L){
case LED_1:
switch(C){
case LED_ON:
printf("LED_1 打开\n");
break;
case LED_OFF:
printf("LED_1 关闭\n");
break;
}
break;
case LED_2:
switch(C){
case LED_ON:
printf("LED_2 打开\n");
break;
case LED_OFF:
printf("LED_2 关闭\n");
break;
}
break;
case LED_3:
switch(C){
case LED_ON:
printf("LED_3 打开\n");
break;
case LED_OFF:
printf("LED_3 关闭\n");
break;
}
break;
}
if(L==LED_1 && C==LED_ON) //这里的LED_1不写成L=="LED_1"
printf("LED_1 打开\n");
if(L==0 && C==0)
printf("LED_1 打开\n");
//这里的LED_1就相当于一个宏定义
//define LED_1 0
}
int main(int argc, const char *argv[])
{
init(LED_1);
con(LED_1,LED_ON);
init(LED_2);
con(LED_2,LED_OFF);
init(LED_3);
con(LED_3,LED_ON);
return 0;
}
//这里的LED_1就相当于一个宏定义
//define LED_1 0