您的位置:

联合体c语言,c语言中联合体的用法

本文目录一览:

C语言中的联合又什么?

联合又称联合体或共用体(union),共用体是通过成员的相互覆盖,是的几个不同的变量共占一段内存,以此大道节省内存的目的。

union

data

{

int

i;

char

c;

float

f;

}

a;

上面的作用是定义联合体,举个例子吧,就像你定义一个整型常量,如

int

b=1

上面的那段代码等同与int,他是告诉系统有这么一个变量,那么接下来就是设置一个常量了,}号后面接着的a就像int

b=1中的b一样,系统这时就会为a这一个变量分配内存空间。

上面的联合体里有3个成员,也就是说有3个变量,A选项就是正确的赋值方式,就像b赋值为1一样,如果你想对具体某个成员赋值的话,就要用到“.”号或

“-”号,通常用“.”。

C语言中联合体(union)的使用

联合体又被称为共用体,我个人感觉,共用体名字更合理。

和结构体同属于C语言数据类型中的结构类型。

例如

uniuon data{ int i ; char c ;float f;}x;定义共用体类型名称为data类型,有三个属性,分别为

int i ; char c ;float f;这三个属性共同占用内存空间,所以空间占用选属性中占用最多的那个,也就是float f。占用四个字节。由于共同占用,所以在同一时间只能保留一个属性内容

如果为

struct data{ int i ; char c ;float f;}x;则表明定义结构体类型名称为data类型,也是三个属性,不过在内存中占用的是空间大小是三个属性之和。若int类型在编译器中分配4字节的话,总共分配字节数位4+1+4总共9字节。

由于单独占用,所以在同一时间可以保留所有属性内容

关于c语言中联合体/共用体中数据存放的问题?

你好!!!

首先我们了解联合体的所有成员是在内存中共享一块内存的,在某一时刻只能有一个成员使用这个内存!!!

我们来看看一个例子:

#include stdio.h

union

{

int i;

char x[2];

}a;

void main()

{

a.x[0] = 10;

a.x[1] = 1;

printf("%d",a.i);

}

答案:266

解释如下:

union

{

int i;

char x[2];

}a;

在联合体a中定义了两种数据类型,字符数组x以及整形变量i.其中整形变量是16位的,数组大小为2的字符数组为8X2=16位。如此一来,编译器便会为联合体a在内存中开辟一个16位的空间,这个空间里存储联合体的数据,但是这个空间只有16位,它既是整形变量的数据,也是字符数组的数据。如果你的程序从字符数组的角度解析这个空间,那么它就是两个字符,如果你的程序从整型的角度解析这个空间,那么它就是一个整数。

以你的程序为例子,现在已经开辟了一个16位的空间,然后我们假定现在空间还没有被赋值,为:

00000000 00000000

那么在运行完代码

a.x[0] = 10;

a.x[1] = 1;

之后,16位的空间变为:

00001010 00000001

然后程序运行

printf("%d",a.i);

就是把联合体a当成一个整数来解析,而不是字符串数组。那么这样一来,程序就把这16位变成了一个完整的整数:

(00000001 00001010)二进制 = (266)十进制

注意,你可以看到程序在把16位弄成整数的时候把后面八位放在了前面,前面八位放在了后面。这个反序是计算机存储结构造成的,这个和联合体没有直接关系。如果感兴趣的话可以参考汇编语言。

现在我们来看看,你给的例子:

union dt

{

int a;

char b;

double c;

}data;

此时的联合体所占的内存大小是8个字节,接下来执行:

data.a=5;

此此时内存中就不是空的了,也就不会是你说的是随机数,

但是输出:printf("%lf",data.c);结果是0.000000,这个结果我还不能给你准确的解释。但是我可以肯定这与系统把double转换成int 和int 转化成 double 有关!!!

暂时我只能解释这那多!!!

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

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.

联合”与“结构”有一些相似之处。但两者有本质上的不同。在结构中各成员有各自的内存空间,

一个结构变量的总长度是各成员长度之和。而在“联合”中,各成员共享一段内存空间,

一个联合变量的长度等于各成员中最长的长度。应该说明的是,

这里所谓的共享不是指把多个成员同时装入一个联合变量内,

而是指该联合变量可被赋予任一成员值,但每次只能赋一种值,

赋入新值则冲去旧值。联合类型的定义和联合变量的说明一个联合类型必须经过定义之后,

才能把变量说明为该联合类型。

C语言里面的联合体和结构体有什么区别,分别是什么含义?感觉都是一样的,都是类的不同特性

联合体与结构体是很容易混淆的概念。粗略一看,两者无论声明、定义还是定义对象的方式都很相似。然而这两个东西的概念和作用实际千差万别。

首先,联合体的各个成员共用内存,并应该同时只能有一个成员得到这块内存的使用权(即对内存的读写),而结构体各个成员各自拥有内存,各自使用互不干涉。所以,某种意义上来说,联合体比结构体节约内存。

举个例子:

typedef struct

{

int i;

int j;

}A;

typedef union

{

int i;

double j;

}U;

sizeof(A)的值是8,sizeof(U)的值也是8(不是12)。

为什么sizeof(U)不是12呢?因为union中各成员共用内存,i和j的内存是同一块。而且整体内存大小以最大内存的成员的划分。即U的内存大小是double的大小,为8了。sizeof(A)大小为8,因为struct中i和j各自得到了一块内存,每人4个字节,加起来就是8了。

了解了联合体共用内存的概念,也就是明白了为何每次只能对其一个成员赋值了,因为如果对另一个赋值,会覆盖了上一个成员的值。