·C语言引入了两种构造类型—结构体和共用体是为了解决一些关系密切但数据类型不同的数据。
1.1结构体类型定义的一般形式: 2.1共用体类型定义的一般格式:
struct 结构体名 /*struct是关键字*/ union 共用体名 /*union是关键字*/
{ {
结构体成员表; 共用体成员表;
}; };
1.2结构体变量的定义 2.2共用体变量的定义 struct data_type union data_type
{ {
int i; int i;
char ch; char ch;
float f; char ch;
}x; /*法1:定义结构体类型的同时定义该类型变量*/ }x;
·共用体与结构体的区别:共用体的定义虽然是以结构体为基础,但与结构体却有着本质的区别,它们的内存使用方式不同。
共用体是多种数据的覆盖存储,几个不同的成员变量共占同一段内存,且都是从同一地址开始存储的,只是任意时刻只存储一种数据,因此分配给共用体的存储区域大小至少要有存储最大一个数据所需的空间。而对于结构体来说,由于结构体中不同的成员分别使用不同的内存空间,因此一个结构体所占内存空间的大小应是结构体每个成员所占内存大小总和,而且,结构体中每个成员相互独立,不占用同一存储单元。
可以看出x在内存中占用2+1+4=7个字节(实际占用字节数依运行环境而定),而y在内存中只需占用4个字节(float型)。因而在程序设计中采用共用体比采用结构体节省空间。
说明:1)由于共用体变量不是同时存放多个成员的值,因此共用体变量不能进行初始化。
2)由于共用体变量不是同时存放多个成员的值,而只是存放其中的一个值,因此在程序中改变共用体的一个成员,其他成员也会随之改变,最终共用体中所有成员共用一个值(最后赋的值)。
例如:a.1=10; a.ch='H'; a.f=9.9; 依次执行完上述三个赋值语句之后,最终只有a.f的值有效。
例:阅读下列程序,写出运行结果。
#include<stdio.h>
int main()
{
union exa
{
struct
{
int a;
int b;
}out;
int c;
int d;
}e;
e.c=1;e.d=3;
e.out.a=e.c;
e.out.b=e.d;
printf("\n%d,%d\n",e.out.a,e.out.b);
return 0;
}
结果:3,3