C语言基础专题 - 通过案例历学 - 共用体

简介: C语言基础专题 - 通过案例历学 - 共用体

C语言基础 - 通过案例历学 - 共用体


1.什么是共用体?

答:共用体是C语言中一种用户自定义数据类型,它提供了一种使用相同的内存位置的有效方式。其特点是: 可以定义一个带有多成员的共用体,但是任何时候只能有一个成员带有值

2.共用体的定义方法与结构体类似

当然我们推荐花3分钟先掌握结构体(点击标题中的链接),因此为了不重复起见这里我们也是直接从以下代码开始:

#include <stdio.h>
#include <string.h>
 // 先定义公用体,其定义形式与结构体类似,只不过关键字从struct变成了union
union{
   char  SecoendName[50];
   char  FirstName[50];
   char  gender[50]; 
   int   age; 
}stdt1;
int main(){
   strcpy( stdt1.SecoendName, "李");
   strcpy( stdt1.FirstName, "华"); 
   strcpy( stdt1.gender, "男");
   stdt1.age = 17;
   // 然后我们试着在终端打印出这些值,看看运行结果
   printf( "姓 : %s\n", stdt1.SecoendName);
   printf( "名 : %s\n", stdt1.FirstName);
   printf( "性别 : %s\n", stdt1.gender);
   printf( "年龄 : %d\n", stdt1.age);
   return 0;
}

运行结果:

姓 : 
名 : 
性别 : 
年龄 : 17
--------------------------------
Process exited after 0.008393 seconds with return value 0
请按任意键继续. . .

我们发现在上述程序运行中,只有stdt1.age的值是正常的,而其它的都发生了错误,然而在struct所定义的结构体中却没有出现这样的情况!其原因为:

共用体中最后赋给变量的值占用了内存位置

作为比较,我们再看下例:

#include <stdio.h>
#include <string.h>
union{
   char  SecoendName[50];
   char  FirstName[50];
   char  gender[50]; 
   int   age; 
}stdt1;
int main(){
   strcpy( stdt1.SecoendName, "李");
   printf( "姓 : %s\n", stdt1.SecoendName);
   strcpy( stdt1.FirstName, "华"); 
   printf( "名 : %s\n", stdt1.FirstName);
   strcpy( stdt1.gender, "男");
   printf( "性别 : %s\n", stdt1.gender);
   stdt1.age = 17;
   printf( "年龄 : %d\n", stdt1.age);
   return 0;
}

运行结果:

姓 : 李
名 : 华
性别 : 男
年龄 : 17
--------------------------------
Process exited after 0.00925 seconds with return value 0
请按任意键继续. . .

可以看到,这里却正常输出了共用体中所有变量的值!

但这并不意味着这些值在同一时刻都是我们预期所看到的,相反,只不过是这次我们调整了调用printf()函数的顺序,使得printf()函数在同一时间只用到一个成员,并且这个成员正好是最后被赋值的那个成员。因此这里的本质问题就在于:

共用体中的所有成员变量,他们使用的是同一内存位置。每次对其中任一变量赋值都改变的是该同一内存地址的存储内容。

最后共用体特点归纳如下:

  • 共用体的定义和访问都与结构体类似;
  • 共用体实际上是相同的内存位置存储不同的数据类型,变量可以存储如一个整数、一个浮点数,或者一个字符串;
  • 共用体占用的内存应足够存储共用体中最大的成员;
  • 共用体任何时候只能有一个成员带有值;
  • 共用体中最后赋给变量的值占用了公用的那块内存位置,也就仅有是该变量的赋值是可用的;
目录
相关文章
|
4天前
|
存储 C语言
c语言中的共用体
c语言中的共用体
18 0
|
4天前
|
存储 编译器 C语言
C语言共用体
C语言共用体
22 0
C4.
|
4天前
|
存储 C语言
C语言的共用体类型
C语言的共用体类型
C4.
16 0
|
4天前
|
C语言
C 语言中布尔值的用法和案例解析
在编程中,您经常需要一种只能有两个值的数据类型,例如: - 是/否 - 开/关 - 真/假 为此,C语言有一个 `bool` 数据类型,称为布尔值。
118 1
|
6月前
|
存储 C语言
20 C语言 - 共用体
20 C语言 - 共用体
28 0
|
4天前
|
存储 C语言
C语言 -共用体类型
C语言 -共用体类型
17 1
|
4天前
|
C语言
C语言共用体和枚举的使用
C语言共用体和枚举的使用
14 0
|
4天前
|
C语言
C语言基础专题 - 通过案例历学 - 结构体
C语言基础专题 - 通过案例历学 - 结构体
22 0
|
4天前
|
存储 C语言
C语言共用体成员输出的值与赋值时的不同的原因
在使用C语言的共用体时,如果成员输出的值与之前定义共用体变量的时候所赋值的不同,那么很可能是因为定义共用体变量的时候,为共用体的多个成员赋值造成的。因为共用体虽然允许在同一个内存位置上存储不同的数据类型的变量,但是任何时候都只能有一个成员存储值,也就是说,
55 2
|
7月前
|
C语言 容器
C语言经典案例-2
C语言经典案例
74 0