1.联合体的概念
联合体从表面上看与结构体非常类似,但是他们的本质完全不同。结构体每一个成员都有一个独立的内存空间,但是联合体的每一个成员共用同一个内存空间因此联合体也被称为共同体。
语法:
union 联合体标签
{
成员1;
成员2;
成员3;
};
联合体标签:用来区分不同类型的联合体
成员:联合体内存的各个成员
//声明联合体
union
{
int i;
char c;
short s;
double d;
};
int main(int argc, char const *argv[])
{
//联合体变量定义
union node data;
printf("size:%ld\n", sizeof(data));
printf("i:%p\n",&data.i);
printf("c:%p\n",&data.c);
printf("s:%p\n",&data.s);
printf("d:%p\n",&data.d);
return 0;
}
注意:
联合体的尺寸取决于,联合体中成员宽度最宽的。
联合体中所有成员的内存地址(首地址)是同一个
在同一时间内,有效的成员只有一个
当我们给联合体某一个成员赋值的时候其他成员则失效(数据无效)
2.联合体的使用
联合体一般来说比较少使用,如果要用很有可能出现在结构体内部,用来描述一种互斥的数据。
示例:
#include <stdio.h>
#include <string.h>
//声明结构体
typedef struct demo
{
char Name[32];
char Type; //S学生 T老师 F打饭阿姨 Q清洁工
union
{
float num;//成绩
int i;//手抖值
char c;//清洁力
}stat;
}Node;
int main(int argc, char const *argv[])
{
Node data[3];
//把"Even"拷贝到结构体数据则第0位,希望拷贝32字节
strncp(data[0].Name, "Even",32);
data[0].Type = 'Q';
data[0].stat.c = 'A';
//学生
strncpy((data+1)->Name,"Jacy",32);
(data+1)->Type = 'S';
(data+1)->stat.num = 75;
}
3.字节序
大端序与小端序
使用联合体检查当前系统的大端序还是小端序?
4.枚举
概念:枚举本质上一种范围受到限制的整型,比我们可以使用0-3表示4种状态(比如某个硬件的状态:打开、运行、暂停、关闭)
枚举常量列表:
语法:
//声明枚举常量列表
enum 枚举标签{常量1, 常量2,常量3,常量4,};
enum MIC{open, run, stop, close}
使用:
枚举常量的值可以手动修改:
//声明枚举常量列表
enum MIC{open, run=5,stop,close}
总结:
默认情况下枚举常量实际他的值为整型数值,并首个元素默认为0
可以在声明枚举常量列表的时候对他进行赋值,如果没有赋值则等于前一个常量值+1;
在C语言中枚举等价于整型,支持所有整型的操作printf(“%d\n”,run+stop);
枚举的作用提供了一个正确范围,使用一个有意义的单词来表示一个整型数字提高代码的可读性。