天天看点

【联合体的定义、大小;联合体变量的定义、初始化、访问和赋值】(学习笔记15--联合体)联合体的定义联合体的大小联合体变量的定义联合体变量的初始化联合体变量的访问和赋值

目录

  • 联合体的定义
  • 联合体的大小
  • 联合体变量的定义
  • 联合体变量的初始化
  • 联合体变量的访问和赋值
联合体也称共用体或公用体,它和结构体相像,主要在类型定义格式的成员访问方面,但在内存存储上却有着天壤之别

联合体的定义

使用union关键字
union 联合体名
{
	数据类型 成员1;
	数据类型 成员2;
	...
};
           
和结构体的定义格式非常相似,唯一不同的地方,就是把关键字struct换成了union
union A
{
	char a;
	int b;
	double c;
};
           

联合体的大小

联合体与结构体的主要区别就在内存上。结构体的每个成员都拥有自己独立的内存空间,结构体大小为所有成员的大小之和(不考虑内存对齐的情况)。而联合体的所有成员都使用同一段内存空间,联合体大小即为联合体中最大的那个成员大小
结果如下
可见,联合体A的大小为8字节,与成员c的大小相同
【联合体的定义、大小;联合体变量的定义、初始化、访问和赋值】(学习笔记15--联合体)联合体的定义联合体的大小联合体变量的定义联合体变量的初始化联合体变量的访问和赋值
成员a、b、c都是使用相同的一段8字节的内存空间。这样做的最大好处,就是能够节省内存
在一个联合体中,某一时刻,只能存储某一成员的值。后一成员的值会覆盖前一成员的值

联合体变量的定义

就像结构体变量一样,也可以根据联合体类型来定义相应的联合体变量,并且定义的方式也和结构体变量定义的方式类似,有以下三种
(1)根据联合体A,定义出union A类型的联合体变量a1
(2)在union A类型的同时,定义联合体变量a2
union A
{
	char a;
	int b;
	double c;
}a2;
           
(3)定义无名联合类型的联合体类型的联合体变量a3
union
{
	char a;
	int b;
	double c;
}a3;
           

第一种方式可以定义出具有局部或全局作用域的联合体变量

第二种和第三种定义出来的都是具有全局作用域的联合体变量

由于第三种方式定义的是无名联合体类型,因此,只能在该联合体类型定义处直接定义联合体变量,在其它地方无法再定义该类型的联合体变量

联合体变量的初始化

在初始化的时候,只应对一个成员进行初始化即在初始化列表中只放有一个初始值。在默认情况下,会将这个初始值初始化给联合体变量的第一个成员
如果在初始值列表中给出多个初始值,在编译时,编译器会给出警告信息
如果想要对其它位置的成员进行初始化,则可以通过指定初始化方式
和结构体一样,也可以将一个联合体变量作为初始值,直接初始化给同类型的另一个联合体变量

联合体变量的访问和赋值

在访问联合体变量中的成员时,也是使用成员访问运算符,即点运算符
union A a1 = {'A'};
printf("Member a: %c\n",a1.a);
           
结果
Member a: A
           
也可以通过成员访问运算符访问联合体变量的成员,并通过赋值运算符对其进行赋值
结果
再来访问成员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地址,程序可以将其转换为4字节整数类型的IP地址值,并打印输出
#include <stdio.h>
union IP
{
	unsigned char str[4];
	unsigned int digit;
};
int main()
{
	union IP ip;
	printf("Please enter IP address in string format:\n");
	scanf("%d.%d.%d.%d",&ip.str[0],&ip.str[1],&ip.str[2],&ip.str[3]);
	printf("IP address in digital format is: %u\n",ip.digit);
	return 0;
}
           
在接收用户输入的IP地址时,我们将其存储至联合体变量ipd的成员str中,它是一个长度为4的无符号字符类型的数组,因此每个元素都可以存储一个0至255之间的数值。而在打印输出时,我们是通过访问联合体变量ip的第二个成员digit
结果如下
Please enter IP address in string format:
192.168.101.120
IP address in digital format is: 2019928256
           

继续阅读