当前位置:首页 » 编程语言 » 联合体c语言

联合体c语言

发布时间: 2022-04-20 03:26:30

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

uniuon data{ int i ; char c ;float f;}x;
定义了一个结合体名叫x 里面包含了int型变量i,char类型c,float类型变量f
int y;这是声明的一个变量

⑵ C语言联合体存储方法

这个和体系结构有关。首先int行具体是1个字节还是2个字节是不确定的。早期的编译器来说。int是一字节。但是现在的都是2字节。因为计算机处理器一般都是32位处理器。
联合只取最大的空间。比如。你定义的联合体。int
A,char
B[2],其实在计算机里面只占用了2个字节。你存储char时,全占了。当你存储为int类型时候。要么占用一半的空间。要么全部都占用了。这个和计算机体系结构有关。但是a和b是不会同时存在的。联合中的成员同时只能有一个。这个是和结构体区别的地方。如果还有疑问建议你去看看书吧。这个是基础知识。

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

⑷ C语言里,联合体要不要像结构体一样对齐如果要,是几的倍数

也要对齐。首先,联合体要能容纳其中最大的元素;然后,联合体的对齐字节数要跟内部元素的最大对齐字节数一致。
例如,联合体中含有以下几个元素:
union
example
{
char
a;
int
b;
double
c;
struct
d
{
int
x;
int
y;
int
z;
};
};
1.
联合体要能容纳struct
d,因为d是12字节,所以联合体的大小要大于等于12。
2.
联合体的对齐要以double
c为准,因为c是8字节对齐的,最长。
所以最终,联合体的大小是16个字节。

⑸ 关于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语言联合体

应该选B吧
联合体其实就是共占一块地盘的意思。本题总,c占1个字节,而a[0]占4个字节,c将与a[0]的最低一个字节共用一块空间。而a[0]=0x00000039,所以c=0x39,也就是9.

⑺ 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.classa.office
不允许只用联合变量名作赋值或其它操作。
也不允许对联合变量作初始化赋值,赋值只能在程序中进行
5.
联合”与“结构”有一些相似之处。但两者有本质上的不同。在结构中各成员有各自的内存空间,
一个结构变量的总长度是各成员长度之和。而在“联合”中,各成员共享一段内存空间,
一个联合变量的长度等于各成员中最长的长度。应该说明的是,
这里所谓的共享不是指把多个成员同时装入一个联合变量内,
而是指该联合变量可被赋予任一成员值,但每次只能赋一种值,
赋入新值则冲去旧值。联合类型的定义和联合变量的说明一个联合类型必须经过定义之后,
才能把变量说明为该联合类型。

⑻ c语言 联合体问题

什么数组啊!
人家是联合体,是C里面的一种数据类型
楼主,我个人认为,你这样的用法是错误的。
虽然F9的时候没有报错
但我从来没有见过有这么用(也可能是我忘了或本来就见识短)
#include
<stdio.h>
main(){
union{
int
a;
float
b;
char
c;
}x;
x.a=5;
printf("\n%d",x.a);
x.b=105.005;
printf("\n%f",x.b);
x.c='a';
printf("\n%c",x.c);
}
/******原来楼下的****/
由于在联合体中的各变量内存地址相同,大小为最大的最大类型的长度。初始化5的数据直接储存与该地址出,按照取值类型进行处理。然而,数据放入内存中的地址是低字节在前面,而高字节在后面,所有printf("\n%d",x.c);也输出5,如果你使用超过一个字节的数,如258,即
union{
int
a;
float
b;
char
c;
}x;
x.a=258;
printf("\n%d",x.c);
看看,结果就不一致了。
在存放数据的时候是按union里定义的数据类型存放的,读取的时候也是按union里定义的类型进行读取的,但输出的表示形式却是由printf("\n%d",x.c);
中的(%d)控制的。我们知道char类型的数据只占一个字节,所以读出时也只读一个字节的长度,当所放的数据大于一个字节的时候它会舍去一个字节的数据,在用%d输出的时候就会比你原来的int型数据要小256(一个字节能表示的最大整数)——这就是结果不一至的原因。
还有一个值得重视的是,
x.b=105.005;
printf("\n%f",x.b);
x.c=25;
printf("\n%d",x.a);

x.b=1305.005;
printf("\n%f",x.b);
x.c=25;
printf("\n%d",x.a);
执行后printf("\n%d",x.a);
的结果是不一样的。原因是我前面已经说过了“在存放数据的时候是按union里定义的数据类型存放的”(但它并不覆盖原先已经存放过数据的整个union数据区),而读取的时候还是按union里定义的类型进行读取的,但输出的表示形式却是仍由printf("\n%d",x.c);
中的(%d)控制的。
上面我们虽然x.c都是25,但读取的时候,是按union中x.a的数据类型(int型)读出的,这时实际读出的类型就比x.c的char型数据要多了,多出来的数据就来至x.b在内存中残留的数据。

⑼ c语言联合体

union 在这个程序中取四个字节
对:
s->i[0]=0x39;取前两个字节存储
s->i[1]=0x38;取后两个字节存储
而:
printf("%c\n",s->c[0]);则是取 “s->i[0]=0x39;取前两个字节存储” 中的前一个字节,又因为0X39的十进制为57(一个字节最大数64),输出的9的ascii码正好小于64,所以输出的数正好是9.

⑽ c语言中的共用体是什么

所谓共用体类型是指将不同的数据项组织成一个整体,它们在内存中占用同一段存储单元。其定义形式为:
union 共用体名
{成员表列};

union data
{
int a ;
float b;
doublec;
chard;
}obj;
该形式定义了一个共用体数据类型union data ,定义了共用体数据类型变量obj。共用体数据类型与结构体在形式上非常相似,但其表示的含义及存储是完全不同的。先让我们看一个小例子。

union data /*共用体*/
{
int a;
float b;
double c;
char d;
}mm;
struct stud /*结构体* /
{
int a;
float b;
double c;
char d;
};
main( )
{
struct stud student;
printf("%d,%d",sizeof(struct stud),sizeof(union data));
}
运行程序输出:
15,8
程序的输出说明结构体类型所占的内存空间为其各成员所占存储空间之和。而形同结构体的共用体类型实际占用存储空间为其最长的成员所占的存储空间。
对共用体的成员的引用与结构体成员的引用相同。但由于共用体各成员共用同一段内存空间,使用时,根据需要使用其中的某一个成员。从图中特别说明了共用体的特点,方便程序设计人员在同一内存区对不同数据类型的交替使用,增加灵活性,节省内存。

可以引用共用体变量的成员,其用法与结构体完全相同。若定义共用体类型为:
union data /*共用体*/
{
int a;
float b;
double c;
char d;
}mm;
其成员引用为:mm.a,mm.b,mm.c,mm.d 但是要注意的是,不能同时引用四个成员,在某一时刻,只能使用其中之一的成员。

main( )
{
union data
{
int a;
float b;
double c;
char d;
}mm;
mm.a=6;
printf("%d\n",mm.a);
mm.c=67.2;
printf("%5.1lf\n", mm.c);
mm.d='W';
mm.b=34.2;
printf("%5.1f,%c\n",mm.b,mm.d);
}
运行程序输出为:
6
6 7.2
3 4.2,=
程序最后一行的输出是我们无法预料的。其原因是连续做mm.d='W';mm.b=34.2;两个连续的赋值语句最终使共用体变量的成员mm.b所占四字节被写入34.2,而写入的字符被覆盖了,输出的字符变成了符号“ =”。事实上,字符的输出是无法得知的,由写入内存的数据决定。
例子虽然很简单,但却说明了共用体变量的正确用法。

热点内容
用c语言做的程序 发布:2024-05-02 06:26:10 浏览:325
解压用流量 发布:2024-05-02 06:21:46 浏览:316
云购源码系统 发布:2024-05-02 06:12:52 浏览:105
电脑如何进行安卓升级 发布:2024-05-02 06:10:08 浏览:37
元龙第5集免费看完整版缓存 发布:2024-05-02 06:03:47 浏览:668
脚本宣传片 发布:2024-05-02 05:56:26 浏览:570
有线投屏安卓手机如何设置 发布:2024-05-02 05:43:26 浏览:896
抢诚信红包用什么服务器好 发布:2024-05-02 05:37:44 浏览:104
淘宝客源码程序 发布:2024-05-02 05:34:46 浏览:814
大淘客cms源码 发布:2024-05-02 05:33:12 浏览:447