300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > c语言union(c语言union用法)

c语言union(c语言union用法)

时间:2022-04-21 13:06:01

相关推荐

c语言union(c语言union用法)

C语言-程序运行结果是?main(){unionstu{lon

我的机器+vc6运行的结果是12

我的理解是首先取最长的b的长度,但是b的长度比我的机器字长(32位即4个字节)整数倍要短,则sizeof(stu)的长度是12

不知道你的机器是不是64位的

如果是则证明了我的猜测

请问各位C程序高手请问你们在编程中对共同体是怎么理解的,你们为什

共同体就是大家共用同一块地方.

比方公园里的长椅是共用体,你可以坐,他也可以做.大家共同使用.

共同体变量以UNION开头,进行标识.表示程序运行时申请到的这块内存可以共同使用.

比方说吧,内存长度是32位,一个整型变量是4位,可以定义8个整型变量在这个区域,一个字符型变量是8位,就可以定义4个字符型变量.该区域现在的值是[00010002000300040005000600070008],可以表示八个数字[1,2,3,4,5,6,7,8],或者是4个字符[字符1(ASCII码为00010002),字符2(ASCII码为00030004),字符3(ASCII码为00050006),字符4(ASCII码为00070008)]

C语言中union如何使用,请给出具体的案例

C语言中,union的使用与struct 的用法非常类似,主要区别在于union 维护足够的空间来置放多个数据成员中的“一种”,而不是为每一个数据成员配置空间,在union 中所有的数据成员共用一个空间,同一时间只能储存其中一个数据成员,所有的数据成员具有相同的起始地址。

具体的案例:

union StateMachine

char character;

int number;

char *str;

double exp;

一个union 只配置一个足够大的空间以来容纳最大长度的数据成员,以上例而言,最大长度是double 型态,所以StateMachine 的空间大小就是double 数据类型的大小。

union,即“联合”,是一种特殊的类,也是一种构造类型的数据结构。在一个“联合”内可以定义多种不同的数据类型, 一个被说明为该“联合”类型的变量中,允许装入该“联合”所定义的任何一种数据,这些数据共享同一段内存,以达到节省空间的目的(还有一个节省空间的类型:位域)。 这是一个非常特殊的地方,也是联合的特征。另外,同struct一样,联合默认访问权限也是公有的,并且,也具有成员函数。英文直译就是联合体,就是一个多个变量的结构同时使用一块内存区域,区域的取值大小为该结构中长度最大的变量的值。

设有一个教师与学生通用的表格,教师数据有姓名,年龄,职业,教研室四项。学生有姓名,年龄,职业,班级四项。

编程输入人员数据,再以表格输出。

程序用一个结构数组body来存放人员数据,该结构共有四个成员。其中成员项depa是一个联合类型,这个联合又由两个成员组成,一个为整型量class,一个为字符数组office。在程序的第一个for语句中,输入人员的各项数据,先输入结构的前三个成员name,age和job,然后判别job成员项,如为"s"则对联合depa·class输入(对学生赋班级编号)否则对depa·office输入(对教师赋教研组名)。

在用scanf语句输入时要注意,凡为数组类型的成员,无论是结构成员还是联合成员,在该项前不能再加"&"运算符。如程序第18行中

body[i].name是一个数组类型,第22行中的body[i].depa.office也是数组类型,因此在这两项之间不能加"&"运算符。程序中的第二个for语句用于输出各成员项的值:

intmain()

struct

charname[10];

intage;

charjob;

union

intclass;

charoffice[10];

}depa;

}body[2];

intn,i;

for(i=0;i<2;i++)

printf("inputname,age,jobanddepartment\n");

scanf("%s%d%c",body[i].name,&body[i].age,&body[i].job);

if(body[i].job=='s')

scanf("%d",&body[i].depa.class);

scanf("%s",body[i].depa.office);

printf("name\tagejobclass/office\n");

for(i=0;i<2;i++)

if(body[i].job=='s')

printf("%s\t%3d%3c%d\n",body[i].name,body[i].age

,body[i].job,body[i].depa.class);

printf("%s\t%3d%3c%s\n",body[i].name,body[i].age,

body[i].job,body[i].depa.office);

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

void main()

struct

{

char name[10];

int age;

char job;

union

{

int class;

char office[10];

} depa;

}body[2];

int n,i;

for(i=0;i<2;i++)

{

printf("input name,age,job and department\n");

scanf("%s %d %c",body[i].name,&body[i].age,&body[i].job);

if(body[i].job=='s')

scanf("%d",&body[i].depa.class);

else

scanf("%s",body[i].depa.office);

}

printf("name\tage job class/office\n");

for(i=0;i<2;i++)

{

if(body[i].job=='s')

printf("%s\t%3d %3c %d\n",body[i].name,body[i].age ,body[i].job,body[i].depa.class);

else

printf("%s\t%3d %3c %s\n",body[i].name,body[i].age, body[i].job,body[i].depa.office);

}

C语言union的用法

1、我们利用C语言定义一个简单的Union共用体结构。

2、在这个结构中包含若干个属性,其中有Int、Char和Double型。

3、此时我们还能利用Typedef关键字,去重名Union共用体。

4、然后我们就能这里对Union公用体进行定义使用。

5、定义语句无论是在Main函数之外还是之内,我们都能这样对他定义。

6、其实他还有一种比较特殊的用法,我们可以直接利用Typedef重名后的d来直接定义Union共用体的用法。

7、所以说Union的用法非常简单,但是要注意与struct结构体之间有一个区分。

union在C中本质上是一个结构体,用法和struct相似,用

union名称{

//...成员

类型使用时,要在名称前加上关键字union

union类型名称变量名称;

在调用时用后缀表达式expression.identifier的形式来调用成员:

a.member1=10;//a为union

p->member1=20;//p为union的指针

但有一些不同点:

1. union,顾名思义,就是多个成员共用一块内存。在编译时会选取成员中长度最长的来声明。也就是说在如下与程序片段中:

uniona{//声明了三个成员,但是长度不一(后面sizeof的结果不同机器结果不同,但double肯定是最长的),于是编译器会选取double的长的作为uniona的长度

inta1;//sizeof(int)=4

floata2;//sizeof(float)=8

doublea3;//sizeof(double)=16

也就是说,上述union声明在内存中等同于

structa{

doublea3;

2. 根据第一条的特点,在对union成员进行赋值后,要注意使用时一定要调用赋值过的成员。首先,extern union定义了一个联合。联合里面包含了一个8位整数stat以及一个结构体。

联合每次只能使用其中的一种类型,也就是说联合要么使用整数stat,要么使用结构体,不能同时使用。

使用整数,很简单,不用多言。

其中的结构体,是一个位字段,里面包含8个bit,可以方便地为每个bit赋值。顺序是反的

因为x86是高字节存在高地址,那tempa【3】地址最高,所以它存的就是long的高字节,所以是反的这个和数据在内存中的存储方式有关。

你看一下下面的数据在内存中的方式就明白了:

int i = 0x009a96ec。

然后你看&i这块内存,它在内存中的顺序是0xec;0x96;0x9a;0x00。

也就是说,这些数据在内存中是反过来存储的。一楼说得很好啊。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。