union_有关共用体
C++基础class、struct、union详细
C++基础class、struct、union详细⽬录1、类class2、结构体struct3、共⽤体union1、类class类是⾯向对象中的特性,在c中是没有类的概念。
通常⽤class来表⽰,cpp中有抽象类,但是没有接⼝这种说法,cpp⽀持多继承。
⼀个普通的类:class Fruit{private:public:Fruit();~Fruit();};Fruit::Fruit(){}Fruit::~Fruit(){}构造函数和析构函数:其中Fruit()表⽰构造函数,~Fruit()表⽰析构函数。
构造函数⽤来创建对象,设置初始化参数。
析构函数在对象销毁的时候执⾏。
修饰符:private:表⽰私有成员,外部不可访问,只有⾃⾝类和友元函数可以访问。
public:表⽰公共成员,外部可以访问。
protected:表⽰保护成员,保护成员和私有成员相似,但是⼦类可以访问保护成员。
类中的成员函数:我们在类中创建函数的时候,可以直接初始化,或者在类外部实现:class Fruit{private:int count;public:Fruit();~Fruit();void add(int i);//直接初始化int getCount(){return count;}};Fruit::Fruit(){cout << "create fruit" << endl;}Fruit::~Fruit(){cout <<"fruit deleted"<<endl;}//在类外部实现void Fruit::add(int i){count = count + i;}友元函数:友元函数虽然可以在类中定义,但是它不属于类的成员函数,必须在类外部实现。
它可以访问定义类中的private和protected成员。
友元类:友元类中的所有函数都是该类的友元。
C语言中的结构体和共用体(联合体)
C语言中的结构体和共用体(联合体)/c-pointer-array/在C 语言中,结构体(struct)是一个或多个变量的集合,这些变量可能为不同的类型,为了处理的方便而将这些变量组织在一个名字之下。
由于结构体将一组相关变量看作一个单元而不是各自独立的实体,因此结构体有助于组织复杂的数据,特别是在大型的程序中。
共用体(union),也称为联合体,是用于(在不同时刻)保存不同类型和长度的变量,它提供了一种方式,以在单块存储区中管理不同类型的数据。
今天,我们来介绍一下C 语言中结构体和共用体的相关概念和使用。
结构体 / struct结构体的定义声明一个结构体类型的一般形式为:struct 结构体名 {成员列表};其中,成员列表中对各成员都应进行类型声明,即:类型名成员名;例如,我们需要在程序中记录一个学生(student)的数据,包括学号(num)、姓名(name)、性别(sex)、年龄(age)、成绩(score)、地址(addr)等,如下图所示:如果要表示图中的数据结构,但C 语言并没有提供这种现成的数据类型,因此我们需要用定义一种结构体类型来表示。
truct student {int num;char name[20];char sex;int age;float score;char addr[30];};上述定义了一个新的结构体类型 struct student(注意,struct 是声明结构体类型时所必须使用的关键及,不能省略),它向编译系统声明,这是一个“结构体类型”,它包括 num、name、sex、age、score、addr 等不同类型的数据项。
应当说,这里的 struct student 是一个类型名,它与系统提供的标准类型(如 int、char、float、double 等)具有同样的作用,都可以用来定义变量的类型。
结构体变量前面只是声明了一个结构体类型,它相当于一个模型,但其中并无具体的数据,编译系统对其也不分配实际的内存单元。
union用法c语言
union用法c语言
c语言中的union是联合体。
就是一个多个变量的结构同时使用一块内存区域,区域的取值大小为该结构中长度最大的变量的值。
联合体union:当多个数据需要共享内存或者多个数据每次只取其一时,可以利用联合体(union)。
共用体的定义:union 共用体{};共用体的初始化与赋值方式与结构体相同。
但任何时刻,共用体只有一个成员变量能够存在。
共用体的大小一定要大于最大的那个成员变量的大小并且可以被最小的成员变量整除。
在union中,所有的字段都有相同的偏移量,而且所有的字段都是相互重叠的,union的大小是其中最大字段的大小。
那我们就知道,如果所有的字段是相互重叠的,那改变其中任何一个字段的值,其他字段的值都会受到影响,也会发生变化。
如果想要使用的话,那么union中的各个字段的使用必须是互斥的,任意时刻只能使用一个。
在阅读《编程卓越之道》有看到union的一些作用,感觉确实可以一用,有一种豁然开朗的感觉。
我整理一下《编程卓越之道》的内容和我自己的理解。
C语言是一门面向过程的、抽象化的通用程序设计语言,
广泛应用于底层开发。
C语言能以简易的方式编译、处理低级存储器。
C语言是仅产生少量的机器语言以及不需要任何运行环境支持便能运行的高效率程序设计语言。
C语言简洁、紧凑,使用方便、灵活。
ANSI C标准C语言共有32个关键字,9种控制语句,程序书写形式自由,区分大小写。
把高级语言的基本结构和语句与低级语言的实用性结合起来。
C 语言可以像汇编语言一样对位、字节和地址进行操作,而这三者是计算机最基本的工作单元。
c语言union和位域的使用
c语言union和位域的使用在 C 语言中,`union`( 联合体)和位域(bit-fields)都是用于在内存中对数据进行灵活组织的特性。
1. 联合体 union):`union`是一种特殊的数据结构,允许在相同的内存位置存储不同的数据类型。
`union`中的所有成员共享同一块内存空间。
`union`的大小等于其最大成员的大小。
这意味着`union`中只能存储其中一个成员的值。
以下是一个`union`的简单示例:union MyUnion {int i;float f;char str[20];};在这个例子中,`MyUnion`是一个联合体,它包含了一个整数`i`、一个浮点数`f` 和一个字符数组`str`。
尽管这些成员占用同一块内存空间,但只能存储其中一个成员的值。
存储一个成员的值后,其他成员的值会被覆盖。
2. 位域 bit-fields):位域允许在结构体中以位(bit)为单位对数据进行存储。
通过使用位域,可以精确地控制特定数据的位数,从而节省内存空间。
以下是位域的简单示例:struct BitFields {unsigned int isMale : 1; // 1位用于存储性别信息unsigned int age : 7; // 7位用于存储年龄信息};在这个例子中,`BitFields`是一个结构体,它包含了两个位域成员`isMale` 和`age`。
`isMale` 用于存储性别信息(1 位),`age` 用于存储年龄信息(7 位)。
通过位域,可以有效地利用位数,而不是整个字节来存储数据,节省内存空间。
需要注意的是,位域在不同的编译器和系统中可能有不同的行为和实现方式,具体的使用要根据具体情况谨慎选择。
总体而言,`union` 和位域提供了在C 语言中对数据进行更灵活组织和管理的方式,但在使用时需要注意内存对齐、可移植性和程序的可读性等问题。
共用体(union)
共⽤体(union)
在C语⾔中,当不同数据类型的数据共同占有使⽤⼀块内存空间时,这个数据构造类型叫做共⽤体,也叫联合体。
共⽤体⽤的地⽅⽐较少,使⽤形式与结构体类似,但是内存使⽤⽅式不同。
1--- 定义
union 共⽤体类型名
{
成员表列;
}变量名1;
union 共⽤体类型名变量名2;
2--- 成员共⽤同⼀个存储区域,共⽤体类型变量是以最后⼀次传递数值为准,之前其他成员所赋的值被覆盖(是不是完全覆盖看成员类型空间⼤⼩,如⼀个4字节int型被1字节char型覆盖掉⼀个字节,输出的是所覆盖的char型值,剩下的空间也不再访问)。
3--- 共⽤体中可以定义多个不同数据类型,共⽤的存储空间⼤⼩是以最⼤的数据类型为准。
4--- 所有成员都从低地址开始存放。
1 #include <stdio.h>
2
3 union we //we:共⽤体类型名
4 {
5int a;
6char b;
7 }u1,u2; //u1:变量
8
9
10int main(int argc, const char *argv[])
11 {
12 u1.a = 177;
13 u1.b = 'a';
14
15 printf("u1.a = %d\n", u1.a);
16 printf("u2.b = %c\n", u1.b);
17
18return0;
19 }。
union 共用条件
union 共用条件Union是一种C语言中的数据类型,它允许在同一内存位置存储不同的数据类型。
这种数据类型的定义方式类似于结构体,但是不同的是,结构体中的各个成员是分开存储的,而Union中的各个成员是共用同一块内存空间的。
因此,Union的大小等于其最大成员的大小。
Union的共用条件是指各个成员共用同一块内存空间的条件。
在定义Union时,需要注意以下几点:1. Union中的各个成员的类型必须不同,否则它们就会占用同一块内存空间,这样就失去了Union的意义。
2. Union中的各个成员的大小不能超过Union的大小,否则就会出现数据截断的情况。
3. Union中的各个成员的访问方式是相同的,即它们都可以通过Union变量名来访问。
下面是一个Union的例子:```union Data {int i;float f;char str[20];} data;```在这个例子中,我们定义了一个名为Data的Union类型,它包含了一个整型变量i、一个浮点型变量f和一个字符数组str。
这三个成员共用同一块内存空间,因此它们的值会相互影响。
我们可以通过以下方式来访问Union中的各个成员:```data.i = 10;printf( "data.i : %d\n", data.i);data.f = 220.5;printf( "data.f : %f\n", data.f);strcpy( data.str, "C Programming");printf( "data.str : %s\n", data.str);```在这个例子中,我们先将整型变量i的值设置为10,然后输出它的值。
接着,我们将浮点型变量f的值设置为220.5,然后输出它的值。
最后,我们将字符数组str的值设置为"C Programming",然后输出它的值。
共用体、枚举和位运算课程思政
共用体、枚举和位运算课程思政
本文旨在探讨共用体、枚举和位运算在计算机科学中的重要性和应用。
共用体(union)和枚举(enum)是C语言中的两种特殊数据类型,而位运算则是计算机中一种高效、灵活的运算方式。
共用体是一种数据结构,它的成员共享同一块内存空间。
这意味着在不同的时间只能存储一个成员,通过改变其中一个成员的值,会对其他成员产生影响。
共用体在内存管理和存储优化方面有很大的作用。
它常用于节约内存的需求,或者在不同数据类型之间进行类型转换。
枚举是一种特殊的数据类型,它定义了一组可取值的常量。
枚举在编程中有很多应用,特别是在需要清晰地表达一组相关常量时。
例如,我们可以使用枚举来定义一周的天数,一个月的月份等。
枚举还可以用于状态机的建模和代码的可读性提高。
位运算是一种对二进制数进行操作的运算方式。
位运算与逻辑运算相比,更加高效,能够在一条指令中同时处理多个数据。
位运算在图像处理、数据加密和网络编程等领域广泛应用。
常见的位运算包括与、或、异或、左移和右移等操作。
共用体、枚举和位运算在计算机科学中扮演着重要的角色。
它们不仅可以提高程序的效率、降低内存的使用,还可以提高代码的可读性和可维护性。
对于熟练掌握这些概念的程序员来说,他们可以更好地理解和解决各种计算机科学问题。
本文介绍了共用体、枚举和位运算在计算机科学中的应用和重要性。
了解和掌握这些概念对于提高程序的效率和代码的可读性至关重要。
希望这篇文章对读者在学习和使用这些概念时能起到一定的帮助和指导作用。
共用体类型数据的特点
共用体类型数据的特点
共用体(union)是一种特殊的数据类型,在C语言中用于存储不同类型的数据,但只占用足够的存储空间来存储这些类型中最大的一种。
共用体的主要特点是:
1、空间共享:共用体中的所有成员共享同一块内存空间。
也就是说,一个共用体变量中只能有一个成员在任何时候被使用。
2、类型可变:共用体可以包含多种不同类型的数据,但一次只能使用其中的一种。
3、大小固定:共用体的大小是其最大成员的大小。
例如,如果一个共用体包含一个整型和一个浮点型变量,那么这个共用体的大小就是最大的那个,也就是浮点型的大小。
4、内存效率:由于共用体的多个成员使用同一块内存空间,所以在处理数据时更加节省内存。
5、成员访问:访问共用体的成员时,必须明确指出成员的类型,因为编译器无法从内存地址推断出正确的类型。
6、使用场景:共用体通常用于处理数据结构,例如网络协议的套接字地址结构。
请注意,共用体的使用有一些限制和注意事项,例如不能包含数组或函数作为其成员,并且不能对共用体进行取址操作。
共用体union详解
共用体union详解一、共用体的概念当需要把不同类型的变量存放到同一段内存单元或对同一段内存单元的数据按不同类型处理则需要使用共用体数据结构例把一个整型变量一个字符型变量一个实型变量放在同一个地址开始的内存单元中共用体的定义形式union 共用体名成员列表变量列表注意区分共用体各成员占相同的起始地址所占内存长度等于最长的成员所占内存结构体各成员占不同的地址所占内存长度等于全部成员所占内存之和二、共用体变量的引用只能引用共用体变量的成员如union data a;a.i;a.ch;a.f;三、共用体类型数据的特点共用体变量中的值是最后一次存放的成员的值如a.i = 1;a.ch = 'a';a.f = 1.5;完成以上三个赋值语句后共用体边量的值是1.5而a.i=1 和 a.ch='a'已无意义共用体变量不能初始化例union data{int i;char ch;float f;}a={1,'a', 1.5} 错误!!!共用体常用来节省内存,特别是一些嵌入式编程,内存是非常宝贵的!共用体也常用于操作系统数据结构或硬件数据结构!union在操作系统底层的代码中用的比较多,因为它在内存共赏布局上方便且直观。
所以网络编程,协议分析,内核代码上有一些用到union都比较好懂,简化了设计。
妙用实例1. 为了方便看懂代码。
比如说想写一个3 * 3的矩阵,可以这样写:struct Matrix{union{struct{float _f11, _f12, _f13, _f21, _f22, _f23, _f31, _f32, _f33;};float f[3][3];}_matrix;};struct Matrix m;这两个东西共同使用相同的空间,所以没有空间浪费,在需要整体用矩阵的时候可以用m._matrix.f (比如说传参,或者是整体赋值等);需要用其中的几个元素的时候可以用m._matrix._f11那样可以避免用m.f[0][0](这样不大直观,而且容易出错)。
C语言共用体(C语言union用法)详解
C语言共用体(C语言union用法)详解通过前面的讲解,我们知道结构体(Struct)是一种构造类型或复杂类型,它可以包含多个类型不同的成员。
在C语言中,还有另外一种和结构体非常类似的语法,叫做共用体(Union),它的定义格式为:union 共用体名{成员列表};共用体有时也被称为联合或者联合体,这也是 Union 这个单词的本意。
结构体和共用体的区别在于:结构体的各个成员会占用不同的内存,互相之间没有影响;而共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员。
结构体占用的内存大于等于所有成员占用的内存的总和(成员之间可能会存在缝隙),共用体占用的内存等于最长的成员占用的内存。
共用体使用了内存覆盖技术,同一时刻只能保存一个成员的值,如果对新的成员赋值,就会把原来成员的值覆盖掉。
共用体也是一种自定义类型,可以通过它来创建变量,例如:1.union data{2.int n;3.char ch;4.double f;5.};6.union data a, b, c;上面是先定义共用体,再创建变量,也可以在定义共用体的同时创建变量:1.union data{2.int n;3.char ch;4.double f;5.} a, b, c;如果不再定义新的变量,也可以将共用体的名字省略:1.union{2.int n;3.char ch;4.double f;5.} a, b, c;共用体 data 中,成员 f 占用的内存最多,为 8 个字节,所以 data 类型的变量(也就是a、b、c)也占用8 个字节的内存,请看下面的演示:1.#include <stdio.h>2.3.union data{4.int n;5.char ch;6.short m;7.};8.9.int main(){10.union data a;11.printf("%d, %d\n", sizeof(a), sizeof(union data) );12. a.n = 0x40;13.printf("%X, %c, %hX\n", a.n, a.ch, a.m);14. a.ch = '9';15.printf("%X, %c, %hX\n", a.n, a.ch, a.m);16. a.m = 0x2059;17.printf("%X, %c, %hX\n", a.n, a.ch, a.m);18. a.n = 0x3E25AD54;19.printf("%X, %c, %hX\n", a.n, a.ch, a.m);20.21.return 0;22.}运行结果:4, 440, @, 4039, 9, 392059, Y, 20593E25AD54, T, AD54这段代码不但验证了共用体的长度,还说明共用体成员之间会相互影响,修改一个成员的值会影响其他成员。
共用体的定义和使用
共用体的定义和使用共用体是一种在 C 语言中存在的数据类型,它允许不同的变量共享相同的内存空间。
这种数据类型通常用于设计一些体积小、数据类型相对简单、且数量较多的数据结构。
在本文中,我们将探讨共用体的定义和使用。
一、共用体的定义共用体的定义与结构体类似,可以使用关键字 union 来定义一个共用体类型。
其中,定义共用体的语法如下:```union union_name {member1;member2;member3;...};```在共用体定义中,member1、member2、member3 等为共用体的成员(通常称为共用体变量),它们共享相同的内存空间。
因此,共用体的大小等于最大成员的大小。
二、共用体的使用共用体的使用通常是通过以下两种方式实现的:1. 访问共用体的成员与结构体类似,可以使用点运算符(.)或箭头运算符(->)来访问共用体的成员。
不同之处在于,不同的成员可以共享相同的内存空间。
因此,改变一个成员的值,可能会影响其他成员的值。
例如:```#include <stdio.h>#include <string.h>union Data {int i;float f;char str[20];};int main( ) {union Data data;data.i = 10;printf( "data.i : %d\n", data.i);data.f = 25.0;printf( "data.f : %f\n", data.f);strcpy( data.str, "C Programming");printf( "data.str : %s\n", data.str);return 0;}```在上述代码中,我们定义了一个共用体 Data,它有三个成员:i、f 和str。
内存对齐(结构体和Union)
}AA;
int main()
{
AA a;
cout<<sizeof(a)<<" "<<sizeof(BB)<<endl;
return 0;
}
结果是
48 24
ok,上面的全看明白了,内存对齐基本过关.
明白了不?
那#pragma pack(2)的结果又是多少呢?对不起,5分钟到了,自己去测试吧.
===============================================================
一会搞定union内存字节对齐
也是转载一个论坛的回复:
其实union(共用体)的各个成员是以同一个地址开始存放的,每一个时刻只可以存储一个成员,这样就要求它在分配内存单元时候要满足两点:
等你看完此3条原则,2分钟已经过去,抓紧时间,实战3分钟:
typedef struct bb
{
int id; //[0]....[3]
double weight; //[8].....[15] 原则1
float height; //[16]..[19],总长要为8的整数倍,补齐[20]...[23] 原则3
char a;//元长度1
int b[5];//元长度4
double c;//元长度8
int d[3];
};
本来mm的空间应该是sizeof(int)*5=20;但是如果只是20个单元的话,那可以存几个double型(8位)呢?两个半?当然不可以,所以mm的空间延伸为既要大于20,又要满足其他成员所需空间的整数倍,即24
共用体
struct st{ union aa v;float w1[5];double ave;}w;
2、写出一列程序的运行结果:
main()
{ union
三、共用体类型数据的特点
(1)同一个内存单元可以用来存放几种不同类型的成员,但在某一时刻只能
存放其中一种,即某一时刻只有一个成员起作用;
(2)共用体变量中起作用的成员是最后一次存放的成员,在存入一个新的成员
值后原来的成员就失去作用;
(3)共用体变量地址和它的各成员的地址都是同一地址;
(4) 不能对共用体变量名赋值,不能在定义共用体变量时初始化;
(5)不能把共用体变量作为函数参数,也不能使函数带回共用体变量,但可以
使用指向共用体变量的指针;
(6)共用体类型可以出现在结构体类型定义之中,可以定义共用体数组。
例如:
1、若有以下说明和定义语句,则变量w在内存中所占字节数是:
11.8共用体
一、共用体的概念
定义共用体类型的形式:
union 共用体名
{ 成员列表};
例Hale Waihona Puke : union data
{ int i;
char ch;
float f;
} a,b,c;
若a.i=65;
则a.ch=?
共用体与结构体不同之处:
结构体变量所占内存长度是各成员占的内存长度之和,各个成
员分别占用自己的内存单元。
共用体变量所占的内存长度等于最长的成员的长度。
二、共用体变量的引用方式
方法: 共用体变量名.成员名
c 共用体 用法
c 共用体用法C语言中的共用体(union)是一种特殊的数据类型,它允许在相同的内存位置存储不同的数据类型。
共用体在C语言中被视为一种容器,可以存储不同的数据类型的值,但在任何时候只能存储其中一个值。
下面我们将详细介绍共用体的用法。
首先,我们需要了解如何声明共用体。
在C语言中,声明共用体的语法如下:cunion 共用体名{数据类型1 成员名1;数据类型2 成员名2;...};例如,我们可以声明一个名为student的共用体,其中包含一个字符数组和一个整数:union student {char name[20];int age;};然后,我们可以使用共用体来创建一个变量,如下所示:cunion student stu1;我们可以使用共用体中的成员来访问和修改共用体的值。
例如,我们可以将一个字符串存储在stu1的name成员中:cstrcpy(, "John");我们也可以将一个整数存储在stu1的age成员中:cstu1.age = 20;需要注意的是,虽然我们可以使用不同的成员来访问和修改共用体的值,但在任何时候只能使用其中一个成员。
这是因为共用体在内存中只占据一个固定大小的区域,而这个区域足够存储所有成员中的最大值。
因此,当我们在一个成员中存储数据时,其他成员的值将被覆盖。
另外,我们可以通过强制类型转换来将一个值转换为共用体中对应的类型。
例如,我们可以将一个字符数组转换为student类型的值:cunion student stu2 = (union student){.name = "John", .age = 20};在实际应用中,共用体通常用于处理不同类型的内存块,例如从文件或网络读取的数据。
我们可以使用共用体来声明一个缓冲区,其中包含不同类型的字段,然后根据需要将数据存储在这些字段中。
这样可以使代码更加灵活和可重用。
c语言中共用体指定位
c语言中共用体指定位全文共四篇示例,供读者参考第一篇示例:共用体在C语言中是一种特殊的数据类型,允许不同类型的数据共享同一块内存空间。
使用共用体可以节约内存空间,提高程序的效率。
在共用体中,所有的成员共用同一块内存,每次只能使用其中的一个成员。
共用体的定义和结构体类似,只是在关键字“struct”前加上关键字“union”。
例如:union Example {int i;float f;char str[20];};上面的共用体定义了一个名为Example的共用体,它有三个成员:一个整型变量i,一个浮点型变量f,一个字符数组str。
这三个成员都共用同一块内存。
在使用共用体时,如果改变了一个成员的值,其他成员的值也会发生变化。
这是因为共用体的所有成员都引用同一块内存。
在共用体中可以指定位域,用于确定每个成员所占用的位数。
例如:union {unsigned int a: 3; // 3位unsigned int b: 4; // 4位unsigned int c: 5; // 5位};上面的共用体定义了三个位域成员a、b和c,它们分别占用3位、4位和5位。
在这个例子中,a占用了0-2位,b占用了3-6位,c占用了7-11位。
使用位域可以有效地节省内存空间,提高程序的效率。
不过需要注意的是,位域成员的位数必须小于字段的大小(通常为8位),否则可能会发生未定义的行为。
在C语言中,共用体指定位可以用来操作二进制位的数据,比如进行位运算、位反转等操作。
以下是一个使用共用体指定位的示例:#include <stdio.h>union {unsigned int bits;struct {unsigned int bit0 : 1;unsigned int bit1 : 1;unsigned int bit2 : 1;unsigned int bit3 : 1;unsigned int bit4 : 1;unsigned int bit5 : 1;unsigned int bit6 : 1;unsigned int bit7 : 1;};} byte;return 0;}在上面的示例中,我们使用共用体定义了一个字节(8位)的数据结构,包含了8个位域成员bit0到bit7。
c语言中共用体的概念
c语言中共用体的概念在 C 语言中,共用体(Union)是一种数据结构,允许在同一内存位置存储不同的数据类型。
与结构体(struct)不同,共用体的成员共享同一块内存空间,只能同时存储其中的一个成员的值。
共用体的概念使得程序员能够在相同的内存位置上以不同的方式解释数据。
共用体的定义语法如下:union union_name {member1_type member1;member2_type member2;// ... 可以有多个成员};其中:union_name 是共用体的名称。
member1_type、member2_type 等是成员的数据类型。
member1、member2 等是成员的名称。
以下是一个简单的共用体的例子:#include <stdio.h>union Number {int integer;float floating_point;};int main() {union Number num;num.integer = 42;printf("Integer: %d\n", num.integer);num.floating_point = 3.14;printf("Floating Point: %f\n", num.floating_point);printf("Integer after using floating_point: %d\n", num.integer);return 0;}在这个例子中,Number 共用体包含两个成员:integer 和floating_point。
这两个成员共享同一块内存。
当给其中一个成员赋值后,它会影响共用体内存的内容,因此在访问另一个成员时,可能会得到不同的结果。
需要注意的是,共用体的大小取决于它最大的成员的大小。
这是因为共用体需要足够的空间来容纳它的最大成员。
共用体的使用
共用体共用体是一种特殊的数据类型,允许在相同的位置存储不同的数据类型,可以定义一个带有多成员的共用体,但是任何时候只能有一个成员带有值。
共用体提供了一种使用相同的内存位置的有效方式。
定义共用体使用union语句定义共用体,方式与定义结构体类似。
union语句定义了一个新的数据类型,带有多个成员。
union语句的格式如下:union [union tag]{member definition;member definition;...member definition;}[one or more union variables];union tag是可选的,每个member definition是标准的变量定义,比如int i;或者float f;或者其他有效的变量定义。
在共用体的末尾,最后一个分号之前。
可以指定一个或多个共用体变量,这是可选的。
下面定义一个名为Data的共用体类型,有三个成员i、f和str:union Data{int i;float f;char str[20];}data;现在,Data类型的变量可以存储一个整数,一个浮点数,或者一个字符串。
这意味着一个变量(相同的内存位置)可以存储多个多种类型的数据。
可以根据需要在一个共用体内使用任何内置的或者用户自定义的数据类型。
共用体占用的内存应足够存储共用体中最大的成员。
例如,在上面的实例中,Data将占用20个字节的的内存空间,因为在各个成员中,字符串所占用的空间是最大的。
下面的实例将显示上面的共用体占用的总内存大小:union Data{int i;float f;char str[20];};int main(){union Data data;printf("Memory size occupied by data:%d\n",sizeof(data));return0;}当上面的代码被编译和执行时,它会产生下列结果:Memory size occupied by data : 20访问共用体成员为了访问共用体成员,我们使用成员运算符(.)。
【C++学习笔记】Union关键字
【C++学习笔记】Union关键字Union关键字的⼏个知识点1. 概念Union是⼀种特殊的类,也是⼀种构造类型的数据结构。
Union共⽤体表⽰⼏个变量共⽤⼀个内存位置,在不同的时间保存不同的数据类型和不同长度的变量。
在Union中,所有的共⽤体成员共⽤⼀个空间,并且同⼀时间只能储存其中⼀个成员变量的值。
2. Union与Struct的区别union和struct有下列区别: 1. union和struct都是由多个不同的数据类型成员组成。
但在任何同⼀时刻,union只存放了⼀个被选中的成员,⽽struct的所有成员都存在。
2. 对于union的不同成员赋值, 将会对其它成员重写, 原来成员的值就不存在了。
⽽对于结构体的不同成员赋值是互不影响的。
3. 在struct中各成员有各⾃的内存空间,⼀个结构变量的总长度是各成员长度之和。
⽽在union中,各成员共享⼀段内存空间,⼀个联合变量的长度等于各成员中最长的长度。
3. union其他注意事项1. 联合⾥⾯那些东西不能存放?我们知道,联合⾥⾯的东西共享内存,所以静态、引⽤都不能⽤,因为他们不可能共享内存。
2. 类可以放⼊联合吗?因为联合⾥不允许存放带有构造函数、析够函数、复制拷贝操作符等的类,因为他们共享内存,编译器⽆法保证这些对象不被破坏,也⽆法保证离开时调⽤析够函数。
本⽂转⾃原⽂如下:联合(union)在C/C++⾥⾯见得并不多,但是在⼀些对内存要求特别严格的地⽅,联合⼜是频繁出现,那么究竟什么是联合、怎么去⽤、有什么需要注意的地⽅呢?就这些问题,我试着做⼀些简单的回答,⾥⾯肯定还有不当的地⽅,欢迎指出!1、什么是联合?“联合”是⼀种特殊的类,也是⼀种构造类型的数据结构。
在⼀个“联合”内可以定义多种不同的数据类型,⼀个被说明为该“联合”类型的变量中,允许装⼊该“联合”所定义的任何⼀种数据,这些数据共享同⼀段内存,已达到节省空间的⽬的(还有⼀个节省空间的类型:位域)。
公用体
共用体的内存使用。 例2: 共用体的内存使用。 #include <s tdio.h> 程序运行结果: 程序运行结果: void main() i=24897,string1=A,string2=a { union i=8224,string1=0,string2=0 { int i; char string[2]; }a; a.i=24897; printf(“i=%d,string1=%c”,a.i,a.string[0]); printf(“string2=%c\n”, a.string[1]); string[0]=’0’; string[1]=’0’; printf(“i=%d,string1=%c”,a.i,a.string[0]); printf(“string2=%c\n”, a.string[1]); }
9.5
枚 举 类 型
1.定义格式: enum 枚举类型名 { 取值表}; 定义格式: 取值表 定义格式 例如, 例如, enum weekdays {Sun,Mon,Tue,Wed,Thu,Fri,Sat}; { } 中的标识符称为枚举常量。 中的标识符称为枚举常量。 它只能为标识符, 它只能为标识符,不能为数字常量或字符常量 2.枚举变量的定义(与结构体变量类似) 枚举变量的定义( 枚举变量的定义 与结构体变量类似) (1)间接定义 ) 例如, 例如,enum weekdays w1,w2; (2)直接定义 ) 例如, 例如, enum weekdays {Sun,Mon,Tue,Wed,Thu,Fri,Sat} w1,w2 ;
例 4: 枚举类型的用法 #include <stdio.h> enum months { JAN=1,FEB,MAR,APR,MAY, JUN,JUL,AUG,SEP,OCT,NOV,DEC }; main() { enum months month; char *mname[]={"","January","February", "March","April","May","June","July", "Auguest", "September", "October","November","Dcember"}; for(month=JAN;month<=DEC;month++) printf("%2d -- %-10s\n",month, mname[month]); }