联合(联合体,共用体)详解

简介: 联合(联合体,共用体)详解

联合是C语言中的另一种高级数据结构,在编写程序过程中合理的使用共用体,可以节省内存空间,还可以简化多种复杂数据的处理!!


关键字:union


联合也是一种特殊的自定义类型!这种类型定义的变量也包含一系列成员,特征是这些成员公用同一块空间(所以联合也叫共用体)


其中,联合的定义形式如下:


union  employee //联合体名
{
  char name[];//成员列表
  int age;
  char sex;
};

与结构体不同,联合的所有成员共享同一块内存,而结构体的每个成员都有自己的内存空间,一个联合类型的字节长度为:占用内存空间最多的成员变量的字节长度!


下面笔者来带领大家测试一下:联合的所有成员共享同一块内存是否成立??


请看笔者代码:


#include <stdio.h>
union un
{
  char c;
  int i;
  double d;
};
int main()
{
  union un un1;
  printf("&un1   :%p\n", &un1);
  printf("un1.c  :%p\n", &(un1.c));
  printf("un1.i  :%p\n", &(un1.i));
  printf("un1.d  :%p\n", &(un1.d));
  return 0;
}


显而易见,代码的运行结果为:


0a2653c851af460fa595bd959398a8f1.png


上面的各个地址都是一样的,说明:联合的所有成员共享同一块内存是成立的!!!


根据联合的最后地址 是一样的这个结果:我们也可以知道:联合体中的成员,不可能同时有,即:在某些时间点上,只有存在1个!!


对于:一个数值,在存储的时候,需要的内存空间只要超过1个字节,就涉及顺序问题:


对于int num=0x11223344;这个在联合体的内存中如何存储??我们来进一步做下探讨:


笔者在之前的文章曾经讲过大小端字节序存储!想要欣赏的各位老铁,可以进行观看一下!!


文章名称为:理解整型在内存中的存储


原文链接为:理解整型在内存中的存储_念君思宁的博客-CSDN博客


大端字节序存储:低位放在高地址,高位放在低地址!!


2d65d23f6d4748949b924e4057485923.png


小端字节序存储:地位放在低地址,高位放在高地址!!


6de278e6d6694ce5bb08e7e842b7e74b.png


在之前的博客中,笔者就有过涉及:VS中是按照小端字节序存储??还是按照大端字节序存储的博客!!在此,笔者用多种方法来给大家演示一下:


1.


#include <stdio.h>
int main()
{
  int num = 1;  //  0x00000001
  char* p = (char*)&num;
  if (*p == 1)
  {
  printf("小端\n");
  }
  else
  {
  printf("大端\n");
  }
  return 0;
}


上述代码中:&num——》int * 类型,强制类型转化为(char *)类型!


代码的运行结果为:


12c3b7f3f8814309a195c64f051d4445.png


int num=1;  //0x00000001


大端字节序存储情况:


34e8d716411043c08c7ffba9fbba23de.png


小端字节序存储情况:


92ba0822ed0b46e1ae72df8a17d3a45b.png


将上面第一个字节,取出那个地方的地址,强制类型转化为(char *)类型的指针!!在后面对其解引用的时候,访问一个字节!!


其实上面的代码,在调试中,能够更好的观察出来情况!!在此,笔者就不再带领大家进行更多的演示了!


2.


#include <stdio.h>
int check_sys()
{
  int num = 1;
  char* p = (char*)&num;
  if (*p == 1)
  return 1;
  else
  return 0;
}
int main()
{
  int ret = check_sys();
  if (ret == 1)
  {
  printf("小端\n");
  }
  else
  {
  printf("大端\n");
  }
  return 0;
}


3


#include <stdio.h>
int check_sys()
{
  union un
  {
  char c;
  int i;
  }u;
  u.i = 1;
  return u.c;
}
int main()
{
  int ret = check_sys();
  if (ret == 1)
  {
  printf("小端\n");
  }
  else
  {
  printf("大端\n");
  }
  return 0;
}


上面的三种代码,都是判断大小端的正确代码!!


在联合体的那种写法中:


u.i = 1;    u.c;  共用同一块起始地址!!


d79b274929334152a6d38be91e2d1be3.png


这次,笔者的大致内容已经讲解完毕,若有其他需要,请欣赏笔者的下一篇关于联合体大小计算的博客,或者私聊笔者,都可以哟!!


相关文章
|
3月前
|
存储 安全 C语言
结构体与联合体
结构体与联合体
25 0
|
6月前
|
存储 C语言
c共用体
c共用体
41 1
|
6月前
|
存储 C语言
C语言——联合(共用体)~~详解
C语言——联合(共用体)~~详解
35 0
|
6月前
|
存储 C语言
共用体
共用体
72 0
|
6月前
|
机器学习/深度学习 C语言
结构体与共用体2
结构体与共用体2
30 0
|
6月前
结构体与共用体3
结构体与共用体3
26 0
|
6月前
|
存储
介绍位段,枚举和联合
介绍位段,枚举和联合
38 2
|
6月前
|
存储 编译器 C语言
【自定义类型】--- 位段、枚举、联合
【自定义类型】--- 位段、枚举、联合
91 0
|
C语言
C语言联合(共用体)
C语言联合(共用体)
37 0
|
存储
C 共用体
C 共用体。
24 0