博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
union:C/C++语言关键字 内存使用
阅读量:4071 次
发布时间:2019-05-25

本文共 1444 字,大约阅读时间需要 4 分钟。

1. 共用体声明和共用体变量定义

  共用体(参考“共用体”百科词条)是一种特殊形式的变量,使用关键字union来定义
  共用体(有些人也叫"联合")声明和共用体变量定义与结构体十分相似。其形式为:
  union 共用体名{
  数据类型 成员名;
  数据类型 成员名;
  ...
  } 变量名;
  共用体表示几个变量共用一个内存位置,在不同的时间保存不同的数据类型和不同长度的变量。在union中,所有的共用体成员共用一个空间,并且同一时间只能储存其中一个成员变量的值。
  下例表示声明一个共用体foo:
  union foo{
  int i;
  char c;
  double k;
  };
  再用已声明的共用体可定义共用体变量。
  例如用上面说明的共用体定义一个名为bar的共用体变量, 可写成:
  union foo bar;
  在共用体变量bar中, 整型变量i和字符变量c共用同一内存位置。
  当一个共用体被声明时, 编译程序自动地产生一个变量, 其长度为联合中最大的变量长度的整数倍。以上例而言,最大长度是double数据类型,所以foo的内存空间就是double型的长度。
  union foo
  {
  char s[10];
  int i;
  };
  在这个union中,foo的内存空间的长度为12,是int型的3倍,而并不是数组的长度10。若把int改为double,则foo的内存空间为16,是double型的两倍。
  它的内存大小与struct的类似,可以参考一下。
  由于union的数据成员共用一个内存空间,所以必须存取正确的成员才能正确的读取变量值,可以使用一个额外的变数或列举型态来记录最后一次使用空间的是哪个成员,例如:
  #include <iostream>
  using namespace std;
  union StateMachine {
  public:
  char character;
  int number;
  char *str;
  StateMachine(char c) {
  character = c;
  }
  StateMachine(int n) {
  number = n;
  }
  StateMachine(char* s) {
  str = s;
  }
  };
  enum State {character, number, str};
  int main() {
  State state = character;
  StateMachine machine('J');
  ...
  if(state == character)
  cout << machine.character << endl;
  ...
  return 0;
  }
  另外要注意的是,union的成员不可以为静态、引用,如果是自订型态的话,该自订型态成员不可以有建构函式、解构函式或是复制指定运算子。
2. 共用体和结构体的区别
  共用体和结构体有下列区别:
  1. 共用体和结构体都是由多个不同的数据类型成员组成, 但在任何同一时刻, 共用体只存放了一个被选中的成员, 而结构体的所有成员都存在。
  2. 对于共用体的不同成员赋值, 将会对其它成员重写, 原来成员的值就不存在了, 而对于结构体的不同成员赋值是互不影响的。

转载地址:http://kseji.baihongyu.com/

你可能感兴趣的文章
React Native(二):属性、状态
查看>>
JSX使用总结
查看>>
React Native(四):布局(使用Flexbox)
查看>>
React Native(七):Android双击Back键退出应用
查看>>
Android自定义apk名称、版本号自增
查看>>
adb command not found
查看>>
Xcode 启动页面禁用和显示
查看>>
【剑指offer】q50:树中结点的最近祖先
查看>>
二叉树的非递归遍历
查看>>
【leetcode】Reorder List (python)
查看>>
【leetcode】Linked List Cycle (python)
查看>>
【leetcode】Candy(python)
查看>>
【leetcode】Sum Root to leaf Numbers
查看>>
【leetcode】Pascal's Triangle II (python)
查看>>
java自定义容器排序的两种方法
查看>>
如何成为编程高手
查看>>
本科生的编程水平到底有多高
查看>>
备忘:java中的递归
查看>>
Solr及Spring-Data-Solr入门学习
查看>>
python_time模块
查看>>