共用体
1.产生及意义
2.类型描述
union 共用体名
{
数据类型 成员名1;
数据类型 成员名2;
...............;
};
3.嵌套类型
4.定义变量(变量 数组 指针) ,初始化及成员引用
成员引用: 变量名.成员名
指针名->成员名
5.占用内存大小
6.函数传参(值 地址)
7.位域
共用体定义与引用
#include<stdio.h>
#include<stdlib.h>
union test_un // 多个成员共用一块空间,根据里面最大的那个数据类型来分配占用的空间
{
int i;//4
float f;//4
double d;//8
char ch;//1
};
int main()
{
union test_un a;
union test_un *p = &a;
union test_un = arr[3];
a.f = 345.678;
p->f = 345.678;
printf("%d\n",sizeof(a));
//printf("%f\n",a.f);
//printf("%d\n",a.i);
exit(0);
}
嵌套定义和位域问题
#include<stdio.h>
#include<stdlib.h>
#include<stdint.h>
struct
{
int i;
char ch;
union
{
int a;
char c;
}un;
float f;
};//结构体嵌套共用体
union
{
int a;
double d;
struct
{
int arr[10];
float f;
}c;
};//共用体嵌套结构体
union
{
struct
{
uint16_t i;
uint16_t j;
}x;
uint32_t y;
}a;//同时由于结构体x和整数y共享内存空间,结构体x的两个成员i和j的值也被修改为了相应的值。
//联合体(union)来访问同一块内存中的不同部分。联合体的特点是它的所有成员共享同一块内存空间,
//因此修改一个成员的值会影响到其他成员。这是因为联合体中所有成员都从同一内存地址开始。
int main()
{
unsigned int i = 0x11223344;
printf("%x\n",(i >> 16) + i & 0xFFFF);
a.y = 0x11223344;
printf("%x\n",a.x.i + a.x.j);
exit(0);
}
位域
#include<stdio.h>
#include<stdlib.h>
#include<stdint.h>
union
{
struct
{
char a:1;//一个比特位
char b:2;
char c:1;
}x;
char y;
}w;
int main()
{
w.y = 1;
printf("%d\n",w.x.a);
exit(0);
}
枚举
enum 标识符
{
成员1;
成员2;
...;
};
#include<stdio.h>
#include<stdlib.h>
enum day
{
MON,
TUS,
THR,
WES,
FRI,
AST,
SUN
};//默认从0开始
enum day
{
MON = 1,
TUS,
THR,
WES,
FRI,
AST,
SUN
};//或者赋值第一个 或者第几个 自动顺次往下排
enum
{
STATE_RUNNING = 1,
STATE_CANCELED,
STATE_OVER
};
struct job_st
{
int id;
int state;
time_t start,end;
};
int main()
{
enum day a = MON;
a = SUN;
printf("%d\n",a);
struct job_st job1;
/*获取任务状态 job1.state = STATE_OVER;*/
switch(job1.state)
{
case STATE_RUNNING:
;
break;
case STATE_CANCELED:
;
break;
case STATE_OVER:
;
break;
default:
abort();
}
exit(0);
}