• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

SOC/IP验证工程师

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

C语言中共用体(联合体)类型的用法

有时候想用同一段内存单元存放不同类型的变量,例如,一个短整型,一个字符型和一个实型变量放在同一个地址开始的内存单元中。以上三个变量在内存中占的字节数不同,但都是从同一个地址开始存放。也就是使用覆盖技术,后一个数据覆盖前面的数据。使几个不同的变量共享同一段内存的结构,称为共用体类型。
union 共用体名
{成员列表
} 变量表列;
声明和定义变量的方式1:
union {
int i;
char ch;
float f;
} a, b, c;
声明和定义变量的方式2:
union Data
{int i;
char ch;
float f;
} a, b, c;
声明和定义变量的方式3:
union Data
{int i;
char ch;
float f;
};
union Data a, b, c;
结构体变量所占内存长度是个成员占的内存长度之和。每个成员分别占有其自己的内存单元。而共用体变量所占的内存长度等于最长的成员的长度。
注意1:不能引用共用体变量,只能引用共用体变量中的成员。

a.i
a.ch
a.f
printf("%d", a);//这种是错误的
printf("%d", a.i);//这种是正确的

共用体类型的特点:
1.同一个内存段可以用来存放几种不同类型的成员,但在每一瞬时只能存放其中一个成员,而不是同时存放几个。
2.可以对共用体变量初始化,但初始化表中只能有一个常量。

union Data
{ int i;
  char ch;
  float f;
} a={1, 'a', 1.5};//不能初始化3个数据,他们占用同一段存储单元
union Data a = {16};//正确,对第一个成员初始化
union Data a = {.ch='j'};//C99允许对指定的一个成员初始化

3.共用体变量中起作用的成员是最后一次被赋值的成员,在对共用体变量中的一个成员赋值后,原有变量存储单元中的值被取代。
4.共用体变量的地址和它的成员的地址都是同一地址。
5.不能对共用体变量名赋值,也不能企图引用变量名来得到一个值。

a=1;//不能对共用体变量赋值;
int m = a;//企图引用共用体变量名以得到一个值赋给整型变量a,不正确

C99允许同类型的共用体变量互相赋值。
b=a;//a和b是同类型的共用体变量,合法
6.以前的C规定不能把共用体变量作为函数参数,但可以使用指向共用体变量的指针做函数参数。C99允许共用体类型变量作为函数参数。
7.共用体类型可以出现在结构体类型定义中,也可以定义共用体数组。反之,结构体也可以出现在共用体类型定义中,数组也可以作为共用体的成员。

posted on 2022-11-20 19:31  SOC验证工程师  阅读(1010)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3