c语言中的union是什么意思啊?

供稿:hz-xin.com     日期:2025-01-21
c语言,union有什么用?

本质上来说和结构体是一样的,但是从包装的角度来看有差异。
1、union中可以定义多个成员,union的大小由最大的成员的大小决定。
2、union成员共享同一块大小的内存,一次只能使用其中的一个成员。
3、对某一个成员赋值,会覆盖其他成员的值(也不奇怪,因为他们共享一块内存。但前提是成员所占字节数相同,当成员所占字节数不同时只会覆盖相应字节上的值,比如对char成员赋值就不会把整个int成员覆盖掉,因为char只占一个字节,而int占四个字节)

4、联合体union的存放顺序是所有成员都从低地址开始存放的。
下面看一个简单的代码:
#include typedef union{ char c; int a; int b;}Demo; int main(int argc, char **argv){ Demo d; d.c = 'H'; d.a = 10; d.b = 12; printf("size: %d
", sizeof(d)); printf("%c%d%d
", d.c, d.a, d.b); return 0;}具体用法举例:

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](这样不大直观,而且容易出错)。2. 用在强制类型转换上(比强制类型转换更加容易看懂)下面举几个例子:(1). 判断系统用的是big endian 还是 little endian(其定义大家可以到网上查相关资料,此略)
#define TRUE 1
#define FALSE 0
#define BOOL int


BOOL isBigEndian()
{
int i = 1; /* i = 0x00000001*/
char c = *(char *)&i; /* 注意不能写成 char c = (char)i; */
return (int )c != i;
}
如果是little endian字节序的话,那个i = 1;的内存从小到大依次放的是:0x01 0x00 0x00 0x00,如是,按照i的起始地址变成按照char *方式(1字节)存取,即得c = 0x01;反之亦然也许看起来不是很清晰,下面来看一下这个:

BOOL isBigEndian()
{
union
{
int i;
char c;
}test;

test.c = 2;

return test.i != 2;
}
这里用的是union来控制这个共享布局,有个知识点就是union里面的成员c和i都是从低地址开始对齐的。同样可以得到如此结果,而且不用转换,清晰一些。什么,不觉得清晰??那再看下面的例子:(2). 将little endian下的long long类型的值换成 big endian类型的值。已经知道系统提供了下面的api:long htonl(long lg);作用是把所有的字节序换成大端字节序。因此得出下面做法:
long long htonLL(long long lg)
{
union
{
struct
{
long low;
long high;
}val_1;
long long val_2;
}val_arg, val_ret;


if ( isBigEndian() )
return lg;
val_arg.val_2 = lg;


val_ret.val_1.low = htonl( val_arg.val_1.high );
val_ret.val_1.high = htonl( val_arg.val_1.low );

return val_ret.val_2;
}
只要把内存结构的草图画出来就比较容易明白了。(3).为了理解c++类的布局,再看下面一个例子。有如下类:
class Test
{
public :
float getFVal(){ return f;}
private :
int i;
char c;
float f;
};
Test t;

不能在类Test中增加代码,给对象中的f赋值7.0f.
class Test_Cpy
{
public :
float getVal(){ return f;}
float setVal(float f){ this ->f = f;}
private :
int i;
char c;
float f;
};

....

int main()
{
Test t;
union
{
Test t1,
Test_Cpy t2;
}test;

test.t2.setVal(7.0f);
t = test.t1;
assert( t.getVal() == 7.0f );

return 0;
}
说明:因为在增加类的成员函数时候,那个类的对象的布局基本不变。因此可以写一个与Test类一样结构的类Test_Cpy,而多了一个成员函数setVal,再用uinon结构对齐,就可以给私有变量赋值了。(这种方法在有虚机类和虚函数机制时可能失灵,故不可移植)至于详细的讨论,网上有,这个例子在实际中没有用途,只是用来考察这个内存布局的使用而已.union在操作系统底层的代码中用的比较多,因为它在内存共赏布局上方便且直观。所以网络编程,协议分析,内核代码上有一些用到union都比较好懂,简化了设计。

union的意思是协会。这些名词均有“社团,会社,协会”之意。club表俱乐部或会社,其成员因志同道合,有共同兴趣、爱好而组织到一起进行社交、娱乐或体育等活动。association指较为正式的组织,强调兴趣和需要的一致性。institute指为专门的目标而建立的学会或研究所。league指为了共同的目的和利益而组成的社团、同盟或联合会。union多指工会,也指学会或协会。society可与association换用,但前者的宗旨更严格,会员之间联系更紧密,活动更积极。这些名词均含“联盟、同盟、联合会”之意。league普通用词,指为了共同的利益而建立的地区性、全国性或国际性的联合组织,也指民间或半官方组织的联盟。federation泛指用条款固定下来的一切联合,尤指联邦政府。union普通用词,指由若干个体结成的一个统一的整体。强调其永久性。alliance普通用词,指对双方均有利的任何联盟。

c语言中的union是联合体,就是一个多个变量的结构同时使用一块内存区域,区域的取值大小为该结构中长度最大的变量的值。

声明一个struct类型,为date,有一个实例变量today,如果int的大小占4个字节,第一句输出12,union表示可以有多种方法来看待这个数据类型,里面的的数据是共享内存空间的,大小应该是union中最大的类型,第二句输出8。

所在函数库为【ctype.h】 

int isalpha(int ch) 若ch是字母('A'-'Z','a'-'z')返回非0值,否则返回0

int isalnum(int ch) 若ch是字母('A'-'Z','a'-'z')或数字('0'-'9')

返回非0值,否则返回0

int isascii(int ch) 若ch是字符(ASCII码中的0-127)返回非0值,否则返回0

int iscntrl(int ch) 若ch是作废字符(0x7F)或普通控制字符(0x00-0x1F)

以上内容参考:百度百科-C语言函数



  1. c语言中的union 是联合体,就是一个多个变量的结构同时使用一块内存区域,区域的取值大小为该结构中长度最大的变量的值

  2. 联合的定义
    定义一个联合类型的一般形式为: 

     union 联合名  
    {  
    成员表  
    };
    成员表中含有若干成员,成员的一般形式为: 类型说明符 成员名 成员名的命名应符合标识符的规定。
    例如:  
    union perdata
    {
        int class;
        char office;
    };
    定义了一个名为perdata的联合类型,它含有两个成员,一个为整型,成员名为class;另一个为字符数组,数组名为office。联合定义之后,即可进行联合变量说明,被说明为perdata类型的变量,可以存放整型量class或存放字符数组office。

  3. 联合变量的说明
    联合变量的说明和结构变量的说明方式相同, 也有三种形式。即先定义,再说明;定义同时说明和直接说明。以perdata类型为例,说明如下:  
    union perdata
    {
        int class;
        char officae;
    };
    union perdata a,b;
    或者可同时说明为:  
    union perdata
    {  
    int class;
    char office;  
    }a,b;
    或直接说明为:  
    union
    {  
    int class;
    char office;  
    }a,b  
    经说明后的a,b变量均为perdata类型。 a,b变量的长度应等于 perdata 的成员中最长的长度, 即等于office数组的长度,共10个字节。从图中可见,a,b变量如赋予整型值时,只使用了2个字节,而赋予字符数组时,可用10个字节。

  4. 联合变量的赋值和使用
    对联合变量的赋值,使用都只能是对变量的成员进行。 联合变量的成员表示为: 联合变量名.成员名 例如,a被说明为perdata类型的变量之后,可使用 a.class a.office 不允许只用联合变量名作赋值或其它操作。 也不允许对联合变量作初始化赋值,赋值只能在程序中进行

  5. 联合”与“结构”有一些相似之处。但两者有本质上的不同。在结构中各成员有各自的内存空间, 一个结构变量的总长度是各成员长度之和。而在“联合”中,各成员共享一段内存空间, 一个联合变量的长度等于各成员中最长的长度。应该说明的是, 这里所谓的共享不是指把多个成员同时装入一个联合变量内, 而是指该联合变量可被赋予任一成员值,但每次只能赋一种值, 赋入新值则冲去旧值。联合类型的定义和联合变量的说明一个联合类型必须经过定义之后, 才能把变量说明为该联合类型。

   



union的意思是协会。
这些名词均有“社团,会社,协会”之意。
club表俱乐部或会社,其成员因志同道合,有共同兴趣、爱好而组织到一起进行社交、娱乐或体育等活动。
association指较为正式的组织,强调兴趣和需要的一致性。
institute指为专门的目标而建立的学会或研究所。
league指为了共同的目的和利益而组成的社团、同盟或联合会。
union多指工会,也指学会或协会。
society可与association换用,但前者的宗旨更严格,会员之间联系更紧密,活动更积极。
这些名词均含“联盟、同盟、联合会”之意。
league普通用词,指为了共同的利益而建立的地区性、全国性或国际性的联合组织,也指民间或半官方组织的联盟。
federation泛指用条款固定下来的一切联合,尤指联邦政府。
union普通用词,指由若干个体结成的一个统一的整体。强调其永久性。
alliance普通用词,指对双方均有利的任何联盟。

声明一个struct类型,为date,有一个实例变量today,如果int的大小占4个字节,第一句输出12
union表示可以有多种方法来看待这个数据类型,里面的的数据是共享内存空间的,大小应该是union中最大的类型,第二句输出8

自定义变量的联合体

C语言:例子解释,关于union
union是联合的意思,也就是内部的变量是共用同一个存储空间的,以变量中存储空间最大的为整个union的占用空间。这个union中i是int型的占用4个字节,char x[2]是两个字节,那么这个union就占用4个字节。假设分别是byte3,byte2,byte1,byte0。如果用a.x[0]操作的就是byte0(对应16进制数是0xa)...

union是什么牌子
1. Union的基本含义:Union是编程语言中的一个关键字,用于声明共享内存空间的数据结构。它允许在相同的内存位置存储不同的数据类型。这意味着,通过Union,程序员可以在同一内存区域存储不同的值,从而节省内存空间。2. Union在编程中的应用:在不同的编程语言中,Union有不同的实现方式和用途。在某些...

c语言里的union和enum怎么用
至于使用哪一个名字来访问,取决于想使用什么数据类型,是long, short 还是 char 。下图显示了在这个联合(union)中各个元素在内存中的的可能结构,以及如何通过不同的数据类型进行访问:二、enum枚举 1. 枚举的定义 枚举类型定义的一般形式为:enum 枚举名{ 枚举值表 };在枚举值表中应罗列出所有可用...

c语言union用法
在C语言中,union是一种特殊的数据类型,它允许在同一块内存空间中存储不同类型的数据。union的基本用法如下:定义一个union类型时,需要指定成员的类型和数量,这些成员可以相互重叠。在union内部,不同的成员共享同一块内存空间。这意味着当一个成员被赋值时,其他成员的值将会被自动更新。以下是一个...

union和unionall的区别
union(或称为联合)的作用是将多个结果合并在一起显示出来。Union:对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序。Union在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。实际大部分应用中是不会产生重复的记录,最常见的...

c语言 union 意思?
body[i].name是一个数组类型,第22行中的body[i].depa.office也是数组类型,因此在这两项之间不能加"&"运算符。程序中的第二个for语句用于输出各成员项的值:int main(){ struct { char name[10];int age;char job;union { int class;char office[10];} depa;}body[2];int n,i;for(...

UNION是什么意思
联合,c语言中的一个类型.

union用法c语言
在C语言中,`union`是一种特殊的复合数据类型,它允许在相同的内存位置存储不同的数据类型。`union`的主要特点是其所有成员共享同一块内存空间,因此其大小至少足够存储其最大成员。使用`union`可以节省内存,但使用时需要小心,因为同时只能使用其中一个成员。`union`的定义方式类似于结构体(`struct`)...

关于C语言中联合类型数据
程序员可以根据不同的需要,以不同的数据类型来读取联合类型中的数据。也就是说,在一些情况下,以一种数据类型来读取联合类型中的数据,而在另一些情况下,又以另一种数据类型来读取其数据。其用法和结构体类型(struct)一致。union number { int x;long y;double z;};

union用法c语言
在C语言中,`union`是一种特殊的数据类型,它允许在相同的内存位置存储不同的数据类型,但一次只能存储其中一种类型的数据。使用`union`可以节省内存,尤其是在需要存储多种类型但每次只使用其中一种类型数据的场景中。`union`的定义方式与`struct`相似,但不同之处在于`union`的所有成员从同一起始地址...