22、共用体

发布于:2024-12-08 ⋅ 阅读:(153) ⋅ 点赞:(0)

1、共用体

        共用体 --- 用法和结构体类似

        共用体:多个成员共用同一段内存空间。

1.1、共用体定义        

        union 共用体名

        {

                成员类型 成员名;

                成员类型 成员名;

                ....

        };

        共用体的类型名:union 共用体名

        例子:

                定义一个共用体里面有两个成员,一个int类型,一个是char类型                

union Test
{
	int a;
	char b;
};

// 共用体类型名:union Test
1.2、共用体变量        

        定义变量:

                共用体类型 变量名;

                union Test d;

        变量访问成员: 点语法        

#include<stdio.h> 
union Test
{
	int a;
	char b;
};

// 共用体类型名:union Test
int main()
{
	union Test d;
	d.a = 0x12345678;
	d.b = 0x11;
	
	printf("%x %x\n",d.a,d.b);  // 0x12345611 0x11	
	printf("%p %p\n",&d.a,&d.b); // 0062FE9C  0062FE9C
	return 0;
}

        规则:

                共用体成员共用同一段内存空间,所有成员的首地址都是一样的。

                共用体空间所占内存大小:成员中占用空间最多的成员所占的字节数

                对一个成员的写操作,会影响其他成员的数据。

        例:                

#include<stdio.h> 
union data
{
	int a[5];
	char b;
	doube d;
};
			

int main()
{
	printf("%d",sizeof(union data)); // 20
	return 0;
}

2、共用体应用

        2.1、共用体提取每个字节数据        
#include<stdio.h> 
union data
{
	unsigned int a;
	
	struct test
	{
		unsigned char a1;
		unsigned char a2;
		unsigned char a3;
		unsigned char a4;				
	}d;		
};

int main(void)
{
	union data t;
	
	t.a = 0x12345678;
	
	printf("%x %x %x %x\n",t.d.a1,t.d.a2,t.d.a3,t.d.a4);
	return 0;
}
2.2、共用体判断大小端

        判断当前的机器是支持小端还是大端 --- 芯片的不同结构在处理数据存储方式不一样

        大端:低地址存高字节数据,高地址存低字节数据

        小端:低地址存低字节,高地址存高字节

        实现思路:看低地址上存的低字节的数据还是高字节的数据        

#include<stdio.h> 
union test
{
	int a;
	unsigned char b;
}d;


int main (void)
{
	d.a=0x12345678;
	if(d.b == 0x78)
	{
		printf("小端");
	}
	else
	{
		printf("大端");
	}
	return 0;
}

3、位域

C语言允许在一个结构体中以位为单位来指定其成员所占内存长度,这种以位为单位的成员称为“位段”或称“位域”( bit field) 。利用位段能够用较少的位数存储数据。

例:

        有1个字节,8位数据获取它的每一位        

#include<stdio.h> 
typedef union bit
{
	unsigned char byte;
	
	struct 
	{
		unsigned char bit0:1;
		unsigned char bit1:1;
		unsigned char bit2:1;
		unsigned char bit3:1;
		unsigned char bit4:1;
		unsigned char bit5:1;
		unsigned char bit6:1;
		unsigned char bit7:1;					
	}bits;
	
}bit_flag;

int main()
{
	bit_flag a = 0xf8;
	
	printf("%d %d %d %d %d %d %d %d\n",a.bits.bit0,a.bits.bit1,a.bits.bit2,a.bits.bit3,a.bits.bit4,a.bits.bit5,a.bits.bit6,a.bits.bit7);
};


网站公告

今日签到

点亮在社区的每一天
去签到