C++共用体

#共用体的概念# #注意点#

这是共用体的概念:

允许几种不同类型的变量存放到同一段内存单元中,也就是使用覆盖技术,几个变量互相覆盖。这种几个不同的变量共同占用一段内存的结构,被称为共用体类型结构,简称共用体。一般定义 形式为: 
union 共用体名 

数据类型 成员名 1; 
数据类型 成员名 2; 
...... 
数据类型 成员名 n; 
}变量名表列; 
 

它可以全部放一种类型,比如这个例子1:

union data
{
	int i;
	int c;
	int d;

}a;

也可以放不同的类型,例子2:

union data
{
	int i;
	char ch;
	double d;

}a;

共用体还有一个很大的特点:

共用体类型数据具有以下特点: 

同一个内存段可以用来存放几种不同类型的成员,但是在每一瞬间只能存放其中的一种,而不是同时 存放几种。换句话说,每一瞬间只有一个成员起作用,其他的成员不起作用,即不是同时都存在 和起作用的。 

这个特点你可以用来干嘛呢?

你可以看到这里老师和学生信息的的区别就在于,最后一个是班级还是职务。

这个时候就可以先用一个结构体将这些信息打包,而班级和职务是二选一的关系,你能用共用体把它们装到一个内存,等你想要用哪个再要那个出来。

struct {
	int num; char name[10];
	char sex; char job;
	union {
		int grade;
		char position[10];
	}category;
}person[2];//装两种人,一种学生,一种老师

问题来了,我怎么判断什么时候要班级什么时候要职务?

(扶额)当然是看前面职务是老师还是学生啊,如果前一个job是老师就要职务,是学生就要班级。这里能用到if选择语句。

void main() {
	for (int i = 0; i < 2; i++)
	{
		cout << "请输入号码姓名性别职业" << endl;
		cin >> person[i].num >> person[i].name >> person[i].sex >> person[i].job;
		cout << "请输入班级或职务" << endl;
		if (person[i].job == 's')
			cin >> person[i].category.grade;
		else if (person[i].job == 't')
			cin >> person[i].category.position;
	}
}

然后再在里面加一个循环输出,这个代码就算完成了。(这部分我就不写了)

为什么要拿着这道题出来?

因为我的学习顺序就是这样的,但是!

由于这题,我被带偏了……我不知道你们有没有这样?也可能是我自己的问题。。

我下意识觉得共用体中的只能存在一个,他们是并列关系,除了在同一个共用体下,彼此之间没有半点联系。

直到我看到了这题:

union IPAdress {
	unsigned char a[4];
	unsigned int ip;
};

先来一个IP共用体,哦,应该把IP地址是什么给出来。

这个意思应该是指,IP地址在电脑上一般是以32位二进制存储的,但是呢,你看到的或者说从界面获取的基本上是(a.b.c.d)(比如123.255.32.8)这种形式的。

所以这就有一个问题,这两者之间怎么变换?

答案是用共用体。

获取函数的代码如下:

IPAdress GetIP() {

	IPAdress ipa;
	int a0, a1, a2, a3, ip;
	char c;
	scanf_s("%d.%d.%d.%d", &a3, &a2, &a1, &a0);
	ipa.a[3] = a3; ipa.a[2] = a2; ipa.a[1] = a1; ipa.a[0] = a0;
	
	return ipa;
}

前面是先弄了一个共用体,包含长度为4的字符型数组和一个无符号整型。

这里获取IP函数时,先获取四个整数赋值给共用体变量ipa,相当于获取了IP。

初学者这里应该会有两个地方不太懂。

1.获取IP里面获取是4个整数,为什么共用体里定义的却是字符型数组?

2.这里给ipa.a赋了值,为什么不用给ipa.ip赋值?ipa.ip在这里是个什么作用?

先回到第一个问题,首先我们要明白IP地址在电脑的存储方式。

在计算机里,IP地址通常是以 4 个 8 比特的形式存储的,每个 8 比特可以表示一个 0 到 255 之间的整数。

char型是一个字节,一个字节等于8个比特。

所以IP地址刚好用四个字节就可以放得下。

再来到第二个问题,不知道大家还记不记得前面说的,IP地址即可以(a.b.c.d)这样子表示,也可以用一个32位的二进制来表示,也就是一个整型。

因为一个整型有4个字节,即32个比特,刚好放得下32位的二进制。

无论是长度为四的字符型数组,还是一个整型,他们在内存中占得空间都是4个字节,而它们本身又共用同一段内存,且这段内存刚好全部占满。

我最开始想的时候,还很奇怪,为什么没有cin>>ip;ipa.ip=ip;

这是因为在函数中已经给 ipa 中的 a 数组赋值,而 ipa.ip 是一个 unsigned int 类型的变量,它的值由 a 数组中的四个 unsigned char 类型的变量组成。因此,在函数中只需要对 a 数组赋值,ipa.ip 的值就会自动更新。

(未完待续)

有什么问题欢迎讨论

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值