共用体union用法讲解
共用体union用法讲解
一、 联合说明和联合变量定义
联合也是一种新的数据类型, 它是一种特殊形式的变量。
联合说明和联合变量定义与结构十分相似。其形式为:
union 联合名{
数据类型 成员名;
数据类型 成员名;
...
} 联合变量名;
联合表示几个变量公用一个内存位置, 在不同的时间保存不同的数据类型
和不同长度的变量。
下例表示说明一个联合a_bc:
union a_bc{
int i;
char mm;
};
再用已说明的联合可定义联合变量。
例如用上面说明的联合定义一个名为lgc的联合变量, 可写成:
union a_bc lgc;
在联合变量lgc中, 整型量i和字符mm公用同一内存位置。
当一个联合被说明时, 编译程序自动地产生一个变量, 其长度为联合中最大
的变量长度。
联合访问其成员的方法与结构相同。同样联合变量也可以定义成数组或指针,
但定义为指针时, 也要用"->"符号, 此时联合访问成员可表示成:
联合名->成员名
另外, 联合既可以出现在结构内, 它的成员也可以是结构。
例如:
struct{
int age;
char *addr;
union{
int i;
char *ch;
}x;
}y[10];
若要访问结构变量y[1]中联合x的成员i, 可以写成:
y[1].x.i;
若要访问结构变量y[2]中联合x的字符串指针ch的第一个字符可写成:
*y[2].x.ch;
若写成"y[2].x.*ch;"是错误的。
二、 结构和联合的区别
结构和联合有下列区别:
1. 结构和联合都是由多个不同的数据类型成员组成, 但在任何同一时刻,
联合中只存放了一个被选中的成员, 而结构的所有成员都存在。
2. 对于联合的不同成员赋值, 将会对其它成员重写, 原来成员的值就不存
在了, 而对于结构的不同成员赋值是互不影响的。
下面举一个例了来加对深联合的理解。
例4:
main()
{
union{ /*定义一个联合*/
int i;
struct{ /*在联合中定义一个结构*/
char first;
char second;
}half;
}number;
number.i=0x4241; /*联合成员赋值*/
printf("%c%c\n", number.half.first, mumber.half.second);
number.half.first='a'; /*联合中结构成员赋值*/
number.half.second='b';
printf("%x\n", number.i);
getch();
}
输出结果为:
AB
6261
从上例结果可以看出: 当给i赋值后, 其低八位也就是first和second的值;
当给first和second赋字符后, 这两个字符的ASCII码也将作为i 的低八位和高
八
位。
这里注意一点,个人认为谭浩强的C语言书中有一点错误,他书里面说对i赋值
后就不能
够输出结构体 half,其实是可以的
共--用-体
for(i=0;i<2;i++) {
printf(“input name ,age,jiband department\n”); scanf(“%s%d%c”,boby[i].name,&boby[i].age,&boby[i].job); if(boby[i].job= =’s’)
else printf(“%s\tt%3d%3c%s\n”,boby[i].name,boby[i].age, boby[i].job,boby[i].depa.office);
} }
C语言程序设计
printf(“%d”,a);
错误!
总结:共用体类型数据的特点
1.每一瞬时只有一个成员起作用 ; 2. 共用体变量中起作用的成员是最后一次存放的成员; 3.共用体变量的地址和它的各成员的地址都是同一地址; 4.不能对共用体变量名赋值,也不能企图引用变量名来 得到
成员的值,又不能在定义共用体变量时对它初始化。 5. 不能把共用体变量作为函数参数,也不能使函数带回共用体
scanf(“%d”,&boby[i].depa.office); else
scanf(“%s”,boby[i].depa.class); } printf(“name\tage job class office\n”);
for(i=0;i<2;i++) {
if(boby[i].job= =’s’) printf(“%s\t%3d%3c%d\n”,boby[i].name,boby[i].age, boby[i].job,boby[i].depa.class);
变量,但可使用指向共用体变量的指针; 6. 共用体类型可以出现在结构体类型定义中,也可以定义共用
c语言 union和typedef
c语言union和typedef摘要:一、C语言中的联合体(union)1.联合体的概念2.联合体的特点3.联合体的使用场景4.联合体与结构体的区别二、C语言中的typedef1.typedef的概念2.typedef的作用3.使用typedef优化代码4.typedef与宏定义的区别正文:C语言是一种广泛应用于系统开发和嵌入式领域的编程语言。
在C语言中,联合体(union)和typedef是两个非常重要的关键字,它们可以帮助我们更好地管理和组织代码。
一、C语言中的联合体(union)1.联合体的概念联合体是一种特殊的结构体,它允许我们将多个不同类型的变量存储在同一个内存空间中。
在联合体中,变量的数量等于成员数量,且所有成员共享同一内存空间。
当一个联合体的某个成员被修改时,其他成员的值也会相应地发生改变。
2.联合体的特点(1)所有成员共用同一内存空间。
(2)联合体的长度等于最长的成员长度。
(3)只能通过一个联合体的成员访问其他成员。
3.联合体的使用场景联合体常用于以下场景:(1)节省内存空间。
(2)实现数据的一对多关系。
(3)简化代码结构。
4.联合体与结构体的区别联合体与结构体的主要区别在于内存分配和成员访问方式。
联合体的所有成员共享同一内存空间,而结构体的每个成员都有自己独立的内存空间。
此外,访问联合体的成员时,需要通过一个成员作为“中介”,而结构体的成员可以直接访问。
二、C语言中的typedef1.typedef的概念typedef是一个编译时指令,它允许我们为已有的数据类型创建一个新的名字。
通过typedef,我们可以提高代码的可读性和可维护性,同时避免与其他库或标准库中的类型冲突。
2.typedef的作用(1)简化类型声明。
(2)提高代码可读性。
(3)避免类型名冲突。
3.使用typedef优化代码以下是一个使用typedef优化代码的例子:```ctypedef struct {int x;int y;} Point;Point p1 = {1, 2};Point p2 = {3, 4};```通过使用typedef,我们可以更清晰地表示点的坐标,同时避免与其他类型冲突。
c中union的用法 -回复
c中union的用法-回复中括号内的内容为主题:"C中union的用法"一、引言(150-200字)在C语言中,union(联合体)是一种特殊的数据类型,可以存储不同类型的数据,但同一时间只能存储其中的一种数据类型。
它与结构体类似,但有着不同的用途和特性。
本文将一步一步地回答关于C语言中union 的用法,从定义union开始,到讨论其内存布局、访问和使用,最后介绍一些使用union的常见场景。
二、定义union(200-300字)在C语言中,可以使用关键字union来定义union类型。
其基本语法形式如下:union union_name {member_type1 member_name1;member_type2 member_name2;...};其中,union_name是联合体的名称,member_type是联合体成员的数据类型,member_name是成员的名称。
三、联合体的内存布局(300-400字)联合体的内存分配方式与结构体不同。
结构体会为每个成员分配独立的内存空间,而联合体中的所有成员共享同一块内存空间,其大小由最大的成员决定。
四、访问联合体(300-400字)可以使用点运算符(.)来访问联合体成员。
然而,由于联合体所有成员共享同一块内存空间,因此只能同时访问一个成员。
通常,用户需要根据上下文知道当前联合体成员的有效类型才能正确地访问该成员。
五、使用联合体的场景(400-500字)联合体在某些场景下非常有用。
以下是一些常见的使用场景:1. 节省内存空间:由于联合体的内存布局,可以使用联合体来节省内存空间。
例如,一个变量可以是整型、字符型或浮点型,但同一时间只能存储其中一种数据类型。
使用联合体,在不同的情况下,可以共享同一块内存空间,从而节省内存。
2. 实现变体类型(variant type):联合体可以用来实现变体类型,即一个变量可以具有多个不同的类型。
拓展知识8-1 共用体
拓展知识8-1 共用体对于结构体类型,结构体变量中的每一个成员都有各自的存储单元,C语言中还有另外一种数据类型,它当中的每一个成员数据共用一段相同的存储单元,我们把这样的数据类型称为共用体类型。
共用体类型的定义与结构体类型的定义的方式基本相同,只不过它们所使用的关键字不同,定义共用体类型所使用的关键字是union。
1.共用体类型定义的一般格式union 共用体名{数据类型成员名1;数据类型成员名2;… …… …数据类型成员名n;};说明:(1)union是定义共用体类型用的关键字,union与共用体名一起构成共用体类型标识符。
(2)共用体类型定义后,系统并不为其分配存储空间,只有定义了共用体变量后系统才为共用体变量分配相应的存储空间。
【示例1】union data{int a;double b;char c;};定义了一个共用体类型,类型名为data,它有三个成员,a是int型,b是double型,c是char型,它们共用一段存储单元。
2.共用体变量的定义共用体变量的定义与结构体变量的定义基本相同。
一是在定义共用体类型的同时定义共用体变量;二是在定义共用体类型后,用共用体类型标识符(union共用体名)定义共用体变量。
【示例2】union data{int a;double b;char c;}x,y;定义共用体类型的同时定义共用体变量x,y。
【示例2】union data{int a;double b;char c;};union data x,y[3];定义共用体类型后,用共用体类型标识符定义共用体变量x和共用体数组y[3]。
说明:(1)共用体变量定义后,在编译或程序运行时系统为共用体变量分配存储空间,共用体变量的存储长度为各成员中存储长度的最大者。
如【示例2】定义的共用体变量x的存储长度为8个字节。
(2)同样可以定义共用体数组和指向共用体变量的指针。
3.共用体变量的引用对于共用体变量,不能引用整个变量,而只能引用共用体变量中的成员。
union用法
union⽤法
union:联合的意思,即把两次或多次查询结果合并起来。
要求:两次查询的列数必须⼀致
推荐:列的类型可以不⼀样,但推荐查询的每⼀列,想对应的类型以⼀样
可以来⾃多张表的数据:多次sql语句取出的列名可以不⼀致,此时以第⼀个sql语句的列名为准。
如果不同的语句中取出的⾏,有完全相同(这⾥表⽰的是每个列的值都相同),那么union会将相同的⾏合并,最终只保留⼀⾏。
也可以这样理解,union会去掉重复的⾏。
如果不想去掉重复的⾏,可以使⽤union all。
如果⼦句中有order by,limit,需⽤括号()包起来。
推荐放到所有⼦句之后,即对最终合并的结果来排序或筛选。
如:(select * from a order by id) union (select * from b order id);
在⼦句中,order by 需要配合limit使⽤才有意义。
如果不配合limit使⽤,会被语法分析器优化分析时去除。
C语言、C++中的union用法总结
C语⾔、C++中的union⽤法总结开始的话已经好长时间没有更新了,对不起⾃⼰,更对不起我亲爱的读者,同时也对不起⾃⼰开办的这个博客平台。
忙,太忙了,忙于找⼯作,找⼀份好⼯作,纠结于去⼤城市闯呢,还是回到本省的⾸府城市。
⼤家都在纠结这个问题,也希望⼤家和我讨论讨论。
别的先不说了,都⼯作这么长时间了,还回过头来总结union,确实有点过分,要是和⼤家说我⼀直从事于C++开发,还不懂union,⼤家可能还真的不信。
我们每天都在总结那些看似⾼端的东西,什么设计模式(当然我也有总结了)、重构(后期我也会说的了)了,却忽略了那些最基础,最根本的知识点。
今天别⼈问我,我蒙了,所以,就有了这篇⽂章。
什么是union?翻译过来说,就是共⽤体,或者也叫联合体。
说到了union,也就是共⽤体,就不得不说⼀下struct了,当我们有如下的struct 的定义时:复制代码代码如下:struct student{char mark;long num;float score;};关于struct的内存结构,将就会像下图所⽰这样(在x86机器上演⽰):sizeof(struct student)的值为12bytes。
但是,当我们定义如下的union时,复制代码代码如下:union test{char mark;long num;float score;};sizeof(union test)的值为4。
这为什么呢?这就是需要说的。
有的时候,我们需要⼏种不同类型的变量存在在同⼀段的内存空间中,就像上⾯的,我们需要将⼀个char类型的mark、⼀个long类型的num变量和⼀个float类型的score变量存放在同⼀个地址开始的内存单元中。
上⾯的三个变量,char类型和long类型所占的内存字节数是不⼀样的,但是在union中,它们都是从同⼀个地址存放的,也就是使⽤的覆盖技术,这三个变量互相覆盖,⽽这种使⼏个不同的变量共占同⼀段内存的结构,称为“共⽤体”类型的结构。
C语言结构体与联合体的使用技巧
C语言结构体与联合体的使用技巧C语言是一种广泛应用于软件开发领域的编程语言,而结构体和联合体是C语言中非常重要的数据类型。
结构体和联合体的灵活使用可以帮助程序员更好地组织和管理数据,提高代码的可读性和可维护性。
在本文中,我们将探讨一些结构体和联合体的使用技巧。
一、结构体的使用技巧结构体是一种用户自定义的数据类型,它可以将不同类型的数据组合在一起,形成一个新的数据类型。
结构体的定义使用关键字struct,通过定义结构体变量可以访问结构体中的各个成员。
1. 嵌套结构体嵌套结构体是指在一个结构体中定义另一个结构体变量作为成员。
通过嵌套结构体,我们可以更好地组织和管理复杂的数据结构。
例如,我们可以定义一个学生结构体,其中包含学生的基本信息(姓名、年龄等)和成绩信息(语文、数学等)。
这样,我们可以通过一个结构体变量来表示一个学生的完整信息。
2. 结构体指针结构体指针是指指向结构体变量的指针变量。
通过结构体指针,我们可以方便地访问和修改结构体中的成员。
例如,我们可以定义一个指向学生结构体的指针变量,通过该指针变量可以访问和修改学生的各个成员。
这在函数传参和动态内存分配等场景中非常有用。
3. 结构体数组结构体数组是指由多个结构体变量组成的数组。
通过结构体数组,我们可以方便地管理多个具有相同结构的数据。
例如,我们可以定义一个学生结构体数组,通过数组下标可以访问和修改每个学生的信息。
这在需要处理多个学生数据的场景中非常常见。
二、联合体的使用技巧联合体是一种特殊的数据类型,它可以在同一内存空间中存储不同类型的数据。
联合体的定义使用关键字union,通过定义联合体变量可以访问联合体中的各个成员。
1. 节省内存空间联合体可以在同一内存空间中存储不同类型的数据,这样可以节省内存空间。
联合体的大小等于最大成员的大小。
例如,我们可以定义一个联合体,其中包含一个整型成员和一个字符型成员。
当我们只使用其中一个成员时,另一个成员的内存空间就可以被重用。
共用体(共9张PPT)
共用体类型对于我们做一般情况下的编程,并不是很常用。
枚举类型变量的定义和使用
➢ 定义形式:
enum 枚举类型名{枚举常量1,枚举常量2,……,枚举常量n};
➢ 定义方式: SINGLE f;
/*等价于float f;; */
例如:
typedef int INTEGER;
用已定义的枚举类型去定义变量: 共用体的概念及其变量的引用方式
【例7-3】构建最多可以拥有250个字符的字符串类型。
typedef char string[250];
string s;
/*等价于char s[250];*/
strcpy(s, "C Language");
【例7-4】把字符指针定义为字符串类型
typedef char* string;
string s1,s2;
union fourbyte 枚举类型变量的取值范围只能是其所枚举的各个常量,枚举变量的比较相当于比较它们所隐含的整数值,枚举类型变量的值是对应枚举常
量所代表整数值。
{ 枚举类型变量的定义和使用
typedef char* string;
long n; 对于上种方式也可省略枚举类型名:
再用这个类型定义一个变量n:
/*等价于char *s1,s2;*/
s1= "C Language";
s2=s1;
这样一来就使得自定义类型string更像C++和Java语言里 的字符串类型,变量s则更像Java里的字符串对象引用变量。
➢ 共用体所有成员的存储单元共用同一个存储单元,内存 长度是其最长的成员的长度,起作用的成员是最后一次 存放的成员。
主要是为了照顾有其他编程语言背景的人对C语言的使用。
全国计算机二级c语言学习指南课件与历年真题精讲精析 第14章
二级C语言程序设计 学习指南与历年真题精讲精析
第14章 结构体、共用体和用户定义 类型
C语言中可由用户构造的两种数据类型:
1、结构体(struct)
2、共用体(union)
14.1 用typedef说明一种新类型名 1、C语言允许用typedef说明一种新类型名: typedef 类型名 标识符; 2、“类型名”必须是在此语句之前已有定义的类型标 识符,“标识符”是一个用户定义标识符,用作新的 类型名。typedef语句的作用仅仅是用“标识符”来
struct dent*s=&s[0]
则以下表达式中值为2的是_____。 (&s[0])->m s[0].m
B)*(p++)->m
C)(*p).m
*(&s[0])->m
s[0].m
*s[0].m
*&a
a
√
D)*((++p)->m)
*((&s[1])->m)
*s[1].m
*&b
五、函数之间结构体变量的数据传递 1、向函数传递结构体变量的成员 结构体变量中的每个成员可以是简单变量、数组或指针变量 等,作为成员变量,它们可以参与所属类型允许的任何操作。 2、向函数传递结构体变量 结构体变量作实参时,传递给函数对应形参的是它的值,函
}std,pers[3],* pstd; name sex birthday year month day sc[0] sc[1] sc[2] sc[3]
方法2:在说明一个无名结构体类型的同时,直接进行定义: 如:struct { char name[12]; char sex; struct date birthday; float sc[4];
8章 c语言程序设计 结构体,共用体与枚举类型
当通过指针变量引用结构体成员时,若表达式中含有++,-等运算符时,应根据运算符优先级来确定表达式含义。例: ++ p-> score 相当于++( p-> score),结果使score加1。 (++ p)-> score 则再访问成员score之前,使p加1。 例:struct abc {char a[20]; int *pt; }p; pt是结构体类型中的成员,则表达式*p->pt引用的是pt所 指存储单元; *p->pt++是再引用了pt所指存储单元后,使 指针pt加1;( *p->pt)++使pt所指向的单元的值加1;而 *p ++ ->pt在访问了pt所指存储单元后,p加1。
例:struct std_info {char name[9]; char sex[3]; float score; struct date birthday; }stud,arr[5],*p; p=& stud; (1)若要引用结构体类型变量stud 中score成员项,可写成: stud. score p-> score *(p). score arr[1] .score /*通过结构体变量引用*/ /*通过指针变量引用*/ /*通过指针变量引用*/
2.将一个结构体变量作为一个整体赋给另一具有相同类型的 结构体变量 例:struct {char name[15]; int num; }stud1,stud2={“wangfang”,01}; 执行赋值语句: stud1=stud2; 则stud2中把每个成员的值依次赋给stud1中对应的同名成员。 C不允许把一个结构体变量作为一个整体进行输入和输出。 例: scanf(“%d”,& stud1); printf(“%d”,stud1);都是错误的 结构体变量有多个不同类型的数据项,必须逐个用相应的格 式像普通变量一样输入和输出。 scanf(“%s,%d”, stud1. name ,& stud1.num); 注意name[15]是数组,数组名本身就是地址。
