C语言共用体的作用

一、介绍

1、共用体(Union),它的定义格式为:

union 共用体名{
    成员列表
};

共用体有时也被称为联合或者联合体,这也是 Union 这个单词的本意。

2、结构体和共用体的区别在于:结构体的各个成员会占用不同的内存,互相之间没有影响;而共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员。

结构体占用的内存大于等于所有成员占用的内存的总和(成员之间可能会存在缝隙),共用体占用的内存等于最长的成员占用的内存。共用体使用了内存覆盖技术,同一时刻只能保存一个成员的值,如果对新的成员赋值,就会把原来成员的值覆盖掉。其实就是对一块内存按照不同的数据类型分了几个类别。可能一组时int型,一组时double型。

二、作用(单片机方面)

共用体在一般的编程中应用较少,在单片机中应用较多。对于 PC 机,经常使用到的一个实例是: 现有一张关于学生信息和教师信息的表格。学生信息包括姓名、编号、性别、职业、分数,教师的信息包括姓名、编号、性别、职业、教学科目。请看下面的表格:


Name

Num

Sex

Profession

Score / Course
HanXiaoXiao
501

f

s

89.5
YanWeiMin
1011

m

t

math
LiuZhenTao
109

f

t

English
ZhaoFeiYan
982

m

s

95.0

f 和 m 分别表示女性和男性,s 表示学生,t 表示教师。可以看出,学生和教师所包含的数据是不同的。现在要求把这些信息放在同一个表格中,并设计程序输入人员信息然后输出。

如果把每个人的信息都看作一个结构体变量的话,那么教师和学生的前 4 个成员变量是一样的,第 5 个成员变量可能是 score 或者 course。当第 4 个成员变量的值是 s 的时候,第 5 个成员变量就是 score;当第 4 个成员变量的值是 t 的时候,第 5 个成员变量就是 course。

经过上面的分析,我们可以设计一个包含共用体的结构体,请看下面的代码:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

#include <stdio.h>

#include <stdlib.h>

#define TOTAL 4 //人员总数

struct{

 char name[20];

 int num;

 char sex;

 char profession;

 union{

  float score;

  char course[20];

 } sc;

} bodys[TOTAL];

int main(){

 int i;

 //输入人员信息

 for(i=0; i<TOTAL; i++){

  printf("Input info: ");

  scanf("%s %d %c %c", bodys[i].name, &(bodys[i].num), &(bodys[i].sex), &(bodys[i].profession));

  if(bodys[i].profession == ‘s‘){ //如果是学生

   scanf("%f", &bodys[i].sc.score);

  }else{ //如果是老师

   scanf("%s", bodys[i].sc.course);

  }

  fflush(stdin);

 }

 //输出人员信息

 printf("\nName\t\tNum\tSex\tProfession\tScore / Course\n");

 for(i=0; i<TOTAL; i++){

  if(bodys[i].profession == ‘s‘){ //如果是学生

   printf("%s\t%d\t%c\t%c\t\t%f\n", bodys[i].name, bodys[i].num, bodys[i].sex, bodys[i].profession, bodys[i].sc.score);

  }else{ //如果是老师

   printf("%s\t%d\t%c\t%c\t\t%s\n", bodys[i].name, bodys[i].num, bodys[i].sex, bodys[i].profession, bodys[i].sc.course);

  }

 }

 return 0;

}

运行结果:

Input info: HanXiaoXiao 501 f s 89.5
Input info: YanWeiMin 1011 m t math
Input info: LiuZhenTao 109 f t English
Input info: ZhaoFeiYan 982 m s 95.0

Name                Num       Sex     Profession       Score / Course
HanXiaoXiao     501         f               s                   89.500000
YanWeiMin       1011       m              t                    math
LiuZhenTao      109         f                t                    English
ZhaoFeiYan      982        m              s                   95.000000

三、案例(嵌入式)

如下代码利用重叠技术实现用UINT型对数组数据进行接收,然后再将其组合成浮点型(32位)数据进行幅值。

static union
{
    uint8_t data[24];
    float ActVal[6];
}posture;

 if(USART_GetITStatus(USART1, USART_IT_RXNE)==SET)
{
    USART_ClearITPendingBit( USART1,USART_IT_RXNE);
    ch=USART_ReceiveData(USART1);
    posture.data[i] = ch;
    i++;
    if(i >= 24)
    {
        i = 0;
                break;
    }

}
SetPositionX(posture.ActVal[3]);
SetPositionY(posture.ActVal[4]);
SetAngle(posture.ActVal[0]);
    

原文地址:https://www.cnblogs.com/flyingjun/p/8716684.html

时间: 2024-10-10 23:39:10

C语言共用体的作用的相关文章

C语言 共用体

//共用体 union #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<string.h> // union 共用体,构造数据类型,也叫联合体,用途:十几个不同类型的变量共占一段内存(相互覆盖) //共用体在类型定义的时候并不分配内存,定义共用体变量的时候才分配内存 union data{ char c; int a[10]; }udat1; union stu{

C语言共用体union

union共用体说明: 当一个共用体被声明时, 编译程序自动地产生一个变量, 其长度为联合中最大的变量长度的整数倍. 比如union中有{int x; double x1; char name[10];}这个共用体的长度为10字节,因为name[10]是这个共用体中最大的一个变量 #include <stdio.h> struct A { int num; char name[20]; char job; union //共用体关键字union { int x; char zy[20]; }t

C语言共用体存储分析

float类型的数据在内存中是如上存储的,float类型的存储方式如下(摘自博客 http://blog.csdn.net/yezhubenyue/article/details/7436624): 取原文中的部分总结如下: 浮点型变量在计算机内存中占用4字节(Byte),即32-bit.遵循IEEE-754格式标准. 一个浮点数由2部分组成:底数M和指数E. 底数部分 使用2进制数来表示此浮点数的实际值. 指数部分 占用8-bit的二进制数,可表示数值范围为0-255.但是指数应可正可负,所以

瘋子C语言笔记(结构体/共用体/枚举篇)

 (一)结构体类型 1.简介: 例: struct date { int month; int day; int year; }; struct student { int num; char name[20]; char sex; int age; struct date birthday; /*birthday 是 struct date 类型*/ char addr[30]; }student1,student2; (1):结构体可嵌套 (2):与枚举相比结构体内元素为变量,而枚举为常

(C语言)共用体union的使用方法举例

曾经在学校学习C语言的时候一直搞不懂那个共用体union有什么用的.工作之后才发现它的一些妙用,现举比例如以下: 1. 为了方便看懂代码. 比方说想写一个3 * 3的矩阵,能够这样写: [ 注:以下用红色部分标记的地方是后来加入上去的,谢谢yrqing718的提醒!] struct  Matrix { union { struct { float  _f11, _f12, _f13, _f21, _f22, _f23, _f31, _f32, _f33; }; float  f[3][3]; }

C语言之共用体

1:共用体(union)类型的定义 union myunion { int a; char b; }; int main(void) { myunion u1; u1.a = 23; printf("u1.b = %d\n", u1.b);     //23 printf("&u1.a = %p \n",&(u1.a));  //&u1.a = 0xbfbe5c04 printf("&u1.b = %p \n",&

C语言union(联合体、共用体)及应用

C语言union(联合体.共用体)及应用 在结构体(变量)中,结构的各成员顺序排列存储,每个成员都有自己独立的存储位置.联合(union)变量的所有成员共享同片存储区/内存.因此联合变量每个时刻里只能保存它的某一个成员的值. 联合变量也可以在定义时直接初始化,但这个初始化只能对第一个成员进行.例如下面的描述定义了一个联合变量,并进行了初始化. 1 uunion data 2 { 3 char n; 4 float f; 5 }; 6 union data u1 = {3}; //只有u1.n被初

「C语言」「例题」结构体与共用体

本篇收集<C语言程序设计教程>第九章“结构体与共用体”的所有例题. 1 #include <stdio.h> 2 3 /*输入一个学生的基本信息, 4 包括学号.姓名.性别.年龄.出生日期.三门成绩, 5 输出该学生的基本信息和平均成绩*/ 6 7 struct date 8 { 9 int year;/* 年份 */ 10 int month;/* 月份 */ 11 int day; /* 日期 */ 12 }; 13 14 struct student 15 { 16 char

不可或缺 Windows Native (8) - C 语言: 结构体,共用体,枚举,类型定义符

[源码下载] 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 结构体 共用体 枚举 类型定义符 示例cStruct.h #ifndef _MYHEAD_STRUCT_ #define _MYHEAD_STRUCT_ #ifdef __cplusplus extern "C" #endif char *demo_cStruct(); #endif cStruct.c /* * 结构体,共用体,枚举,类型定义符 * * 注:结构体变量在做参数传递时,其内每个