C语言32个关键字
有32个关键字详细说明,还有跳转链接!


一、union 简介

union 是C语言中一种声明共用体的数据类型。
union(共用体)在某种程度上类似struct(结构体)的一种数据结构,可以包含很多数据结构和变量。
union(共用体)的特点:其内部的数据 共用一个内存首地址共享同一段内存,以达到节省空间的目的。

二、union 定义

1. 声明共用体类型

一般形式具体如下:

union 共用体名{ //成员列表 数据类型 成员名; 数据类型 成员名; ....}

举例说明如下:

union _MQ{char data8[4];intdata32;}; 

2. 定义共用体变量

一般形式具体如下:

union _MQ{char data8[4];intdata32;}; //定义共用体变量union _MQ mq;

合并简化形式具体如下:

union _MQ{char data8[4];intdata32;}mq;

匿名结构体形式具体如下:

union {char data8[4];intdata32;}mq;

3. 使用 typedef 声明共用体类型,再定义共用体变量

一般形式如下:

typedef union MQ{char data8[4];intdata32;} _MQ;//定义共用体变量,以下两种效果一样union MQ mq;_MQ mq;

匿名共用体形式具体如下:

typedef union {char data8[4];intdata32;} _MQ;//定义共用体变量_MQ mq;

三、union 使用方法

共用体变量成员—-赋值(.)

初始化定义时—-赋值

typedef union {char data8[4];intdata32;}_MQ; _MQ mq ={.data32=0x12345678 };

初始化后—-赋值

mq.data32=0x12345678;

union(共用体)—-共用内存

#include typedef union {char data8[4];intdata32;}_MQ; _MQ mq ={.data32=0x12345678 };int main(int argc, char *argv[]){printf("data[0]=0x%x\n",mq.data8[0]);printf("data[1]=0x%x\n",mq.data8[1]);printf("data[2]=0x%x\n",mq.data8[2]);printf("data[3]=0x%x\n",mq.data8[3]);return 0;}

运行结果如下:

union(共用体)—-判断系统大小端模式

我的电脑系统是小端模式

大端模式(高字节在前)小端模式(低字节在前)
data32data[0]data[1]data[2]data[3]data[0]data[1]data[2]data[3]
0x123456780x120x340x560x780x780x560x340x12

四、union 占用的内存空间

union(共用体) 占用的内存空间,是由其中占用内存最大的成员变量决定的。

#include typedef union {char data1;intdata2;float data3;double data4; }_MQ; _MQ mq;int main(int argc, char *argv[]){printf("data1占用的%d字节\n",sizeof(mq.data1));printf("data2占用的%d字节\n",sizeof(mq.data2));printf("data3占用的%d字节\n",sizeof(mq.data3));printf("data4占用的%d字节\n",sizeof(mq.data4));printf("共用体占用的%d字节\n",sizeof(mq));return 0;}

运行结果如下:

五、位结构和共用体联合使用

具体程序如下:

#include typedef union {intdata;struct {int a:1;//第0位int b:2;//第1,2位int c:3;//第3,4,5位int d:4;//第6,7,8,9位int e:6;//第10,11,12,13,14,15位}bit;}_MQ; _MQ mq={ .bit.a = 1, .bit.b = 3, .bit.c = 6, .bit.d = 10, .bit.e = 26};int main(int argc, char *argv[]){printf("data=0x%x\n",mq.data);return 0;}

运行结果如下:

解释说明:

变量15 14 13 12 11 109 8 7 65 4 32 10
a(1)1
b(3)11 (3)
c(6)110 (6)
d(10)1010 (10)
e(26)011010 (26)

结果是0b0110101010110111=0x6ab7


C语言:位结构体