C语言中建立数据类型-共用体类型数据特点-学习笔记-54

引入

上节,我们学习了共用体,即所有成员的起始内存地址相同。共用体和结构体的定义方法差不多,我们说结构体和共用体最大的区别就是共用体的占用内存长度是成员中占用内存最长的,而结构体则是成员占用内存长度之和。

共用体特点

共用体和结构体有很多却别,那么这些区别造就了结构体和共用体各自什么样的特点呢?

存放成员

共用体是使用同一段内存存放不同类型的成员,但每一瞬间只能存放一个成员,不能同时存放几个。因为在每一个瞬间,存储单元只能有唯一的内容。

1
2
3
4
5
6
7
8
9
10
union Data{
int i;
char ch;
float f;
}a;
a.i=97;
//我们给 a 这个共用体变量的整型 i 赋值97
printf("%d\n",a.i); //输出97
printf("%c\n",a.ch); //输出「a」
printf("%f\n",a.f); // 输出0.000000

输出结果

97
a
0.000000

共用体 a.i 是整型,我们把97赋值给了这个整型成员 i,然后就按照整数的形式存储到了变量单元中。

  1. %d 格式输出 a.i 就会输出 97
  2. %c 格式输出,系统会吧整数信息按照字符输出 a
  3. %f 格式输出,系统会把信息按浮点输出,故为0.000000

也就是说,共用体变量同时只能存放一种类型的数据,如果按照其他类型输出,会根据存储情况进行转换。

初始化

可以对共用体变量初始化,但是只能对一个成员初始化。

1
2
3
4
5
6
7
union Data{
int i;
char ch;
float f;
}a={1,'a',1.5}; //这种初始化赋值的方法是错的,一次职能对一个成员初始化。
union Data t = {16}; //对第一个成员 i 进行初始化
union Data n= {.ch='j'}; //对指定成员初始化

赋值

为什么说共用体变量中只有最后一个赋值的起作用呢?因为共用体原有的存储单元的值就被取代了。

1
2
3
4
5
a.ch='a';
a.f=1.5;
a.i=40;
printf("%d",a.i);
printf("%c",a.ch);

输出结果

40
(

为什么 %c 输出时,不是 a 而是 ( 呢?因为40是最后赋值的,40把前面存储的数据都覆盖了,所以现在就是把40按照 ASKII 码转换成字母,也就是「 ( 」了。

注意
正是因为共用体这种最后赋值覆盖前面数据的特性,所以要认真分清楚共用体当前的值是什么。

地址相同

因为共用体中的所有成员的起始地址都是相同的,所以

1
2
3
4
&a.i
&a.ch
&a.f
// 上面所有的地址都相同

共用体变量

  • 不能对共用体变量名赋值
  • 不能引用共用体变量名来得到值
  • 相同类型的共用体变量互相赋值
1
2
3
4
5
union Data a,b;
int m;
a=1; // 不能直接给共用体变量名赋值,不知道赋值给谁
m=a; //不能直接引用共用体变量名获得值
b=a; //相同共用体变量可以互相赋值。

函数参数

共用体变量可以作为函数参数,也可以用指针指向该共用体。

嵌套

共用体可以作为结构体的成员出现,反之结构体也可以作为共用体成员。当然,数组也可以作为共用体成员。

特别注意
其实可以这么理解,共用体就是同时只能存储一种类型数据的特殊类型,后面赋值的会覆盖前面的数据。
共用体最大的优势就是,节省内存,灵活多变。

尾巴

这是我的个人学习笔记,主要是应付考研复习使用,充斥着一些吐槽和个人观点,并不严谨,欢迎大家参考、指正。


-------------The End-------------
欢迎请我喝咖啡哦~!