共用体与大小端问题深度解析+枚举使用

共用体(union):
共用体在类型定义、变量定义、使用方法上相似;共用体中的各个成员是一体的,它们使用同一个内存单元(也就是共用体中的说有元素使用的内存单元是同一个,大小是占用内存最大的那个元素的大小)。多用于对同一个内存单元进行多种不同规则的解析。
代码说明:

#include <stdio.h>

// a和b其实指向同一块内存空间,只是对这块内存空间的2种不同的解析方式。
// 如果我们使用u1.a那么就按照int类型来解析这个内存空间;
//如果我们使用u1.b那么就按照char类型
// 来解析这块内存空间。
union myunion
{
	int a;
	char b;
};
union test
{
	int c;
	float d;
};
int main(void)
{
	union test t1;
	t1.c = 1123477881;       
	printf("value = %f.\n", t1.d);     //b=123.456
	
	int c = 1123477881;
	printf("指针方式:%f.\n", *((float *)&c));  //得出123.456
	
	union myunion u1;		// 共用体变量的定义
	u1.a = 23;				// 共用体元素的使用
	printf("u1.b = %d.\n", u1.b);		// u1.b = 23.结论是u1.a和u1.b是相关的
	// a和b的地址一样,充分说明a和b指向同一块内存,只是对这块内存的不同解析规则
	printf("&u1.a = %p.\n", &u1.a);   //u1.a与u1.b的地址相同
	printf("&u1.b = %p.\n", &u1.b);
	return 0;
}

大小端问题:
大小端问题常用于串行通信中,发送方与接收方在进行通信的时候,双方必须按照统一规则(相同的字节顺序)来进行发送和接收。
大端模式:高字节对应高地址
小端模式:高字节对应低地址
例如:存放一个数字1=0x00000001(从左到右为低字节到高字节)
在这里插入图片描述
结合代码说明:
分别于共用体和指针两种方式来测试当前机器的大小端:

#include <stdio.h>
union myunion
{
	int a;
	char b;
};
// 如果是小端模式则返回1,大端模式则返回0
//用共用体的方式来进行测试
int is_little_endian(void)
{
	union myunion u1;
	u1.a = 1;				// 地址0的那个字节内是1(小端)或者0(大端)
	return u1.b;
}
//用指针的方式来进行测试
int is_little_endian2(void)
{
	int a = 1;
	char b = *((char *)(&a));		// 指针方式其实就是共用体的本质
	
	return b;
}
int main(void)
{
	int i = is_little_endian2();
	if (i == 1)
	{
		printf("小端模式\n");
	}
	else
	{
		printf("大端模式\n");
	}
	return 0;
}

枚举:
枚举所达到的功效其实同宏定义相同(不嫌麻烦时可以用宏定义完全替换枚举),但是枚举在定义多个有关联的元素时,要比宏定义简便。
代码说明:

#include <stdio.h>
// 这个枚举用来表示函数返回值,ERROR表示错,RIGHT表示对
enum return_value
{
	ERROR,				// 枚举值常量是全局的,直接自己就可以用。
	RIGHT,
};
enum return_value func1(void); //声明
int main(void)
{
	enum return_value r = func1(); //r接收func1()的返回值

	if (r == ERROR)			// 不是r.RIGHT,也不是return_value.RIGHT
	{
		printf("函数执行错误\n");
	}
	else
	{
		printf("函数执行正确\n");
	}
	return 0;
}

enum return_value func1(void)  //定义func1函数,返回值为r1
{
	enum return_value r1;
	r1 = ERROR;
	return r1;
}
发布了19 篇原创文章 · 获赞 11 · 访问量 3395

猜你喜欢

转载自blog.csdn.net/m0_46204326/article/details/104271439