返回介绍

7.3.5 联合体变量的访问和赋值

发布于 2025-04-11 22:33:03 字数 2253 浏览 0 评论 0 收藏 0

在访问联合体变量中的成员时,也是使用成员访问运算符,即点运算符。例如:

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。