7.3.5 联合体变量的访问和赋值
在访问联合体变量中的成员时,也是使用成员访问运算符,即点运算符。例如:
union A a1 = {'A'}; printf("Member a: %c\n", a1.a);
首先定义了 union A 类型的联合体变量 a1,并将其第一个成员进行初始化为字符常量 A。接着,通过成员访问运算符访问联合体变量 a1 的成员 a,并通过 printf 函数打印输出到控制台窗口。
编译运行程序,结果如下:
Member a: A
也可以通过成员访问运算符访问联合体变量的成员,并通过赋值运算符对其进行赋值。例如:
a1.b = 100;
将整型常量值 100 赋值给联合体变量 a1 的成员 b。下面再次访问联合体变量 a1 的成员 b,并将其值打印输出。例如:
printf("Member b : %d\n", a1.b);
编译运行程序,结果如下:
Member b : 100
现在,再来访问成员 a,并打印输出。例如:
printf("Member a: %c\n", a1.a);
编译运行程序,结果如下:
Member a: d
可见,联合体变量 a1 的成员 a 的值不再是大写字母 A,而变为了小写字母 d。这是由于将成员 b 赋值为 100,导致成员 a 的值被覆盖。ASCII 码值为 100 的字符是小写字母 d,因此,以字符的格式来打印,结果就是小写字母 d。
与结构体变量类似,相同类型的联合体变量之间也是可以直接进行相互赋值的。例如:
union A a2; a2 = a1;
定义了 union A 类型的联合体变量 a2,然后将联合体变量 a1 赋值给联合体变量 a2。经过赋值后,联合体变量 a2 也具有了和联合体变量 a1 相同的值。
最后,再用一个案例,来结束对联合体的介绍。
在计算机网络中,两台计算机要想通信,就需要知道彼此的 IP 地址。我们常见的 IP 地址都是以点分格式的字符串形式出现的,例如“192.168.101.120”。试想一下,在进行网络通信的时候,如果以这种字符串的形式来使用和传递 IP 地址,该字符串是由 12 个数字字符和 3 个“.”字符组成,如果再加上结束标记的空字符,那么大小为 16 字节。若是将 IP 地址改用整数形式来存储或传递的话,只需要 4 字节,体积只有原来的 1/4,好处不言而喻。
【 例 7-2 】编写程序,由用户输入一个字符串类型的 IP 地址,程序可以将其转换为 4 字节整数类型的 IP 地址值,并打印输出。
大家应该知道,字符串格式的 IP 地址中,被 3 个“.”分隔的是 4 个 0~255 的数值,所以我们可以用一个长度为 4 的无符号字符类型数组来存储,为了方便将其转换为整型数字,定义一个联合体类型 IP。例如:
联合体 IP 的第一个成员 str 被定义为长度为 4 的无符号字符类型的数组,而第二个成员 digit 被定义为一个无符号的整型。关键的地方,就在于这两个成员的大小都是 4 字节,无论以哪个成员作为赋值对象,都会存储到这 4 字节的内存空间,而无论以哪个成员进行访问,都可以访问到这 4 字节的内存数据。因此,可以非常方便地让 IP 地址在字符串格式和数字格式之间进行转换。
程序代码如下:
在接收用户输入的 IP 地址时,我们将其存储至联合体变量 ip 的成员 str 中,它是一个长度为 4 的无符号字符类型的数组,因此每个元素都可以存储一个 0 至 255 之间的数值。而在打印输出时,我们是通过访问联合体变量 ip 的第二个成员 digit。
编译运行程序,结果如下:
Please enter IP address in string format: 192.168.101.120 IP address in digital format is: 2019928256
读者如果有兴趣的话,也可以反过来做,读取一个整数格式的 IP 地址值,将其转换为字符串格式的 IP 地址进行打印输出。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论