c语言结构体与共用体之间的区别

合集下载

c语言结构体共用体数据类型求大小例题

c语言结构体共用体数据类型求大小例题

c语言结构体共用体数据类型求大小例题(原创版)目录一、C 语言结构体和共用体的概念二、结构体和共用体的大小计算方法三、例题解析四、总结正文一、C 语言结构体和共用体的概念C 语言中,结构体和共用体是两种特殊的数据类型,它们都可以用来描述一个复合数据类型。

结构体和共用体的主要区别在于它们存储数据的方式不同。

结构体是一种复合数据类型,它可以包含多个不同类型的成员变量。

结构体中的成员变量按照定义的顺序排列,并且每个成员变量都有一个唯一的名字。

结构体可以看作是一个数据容器,它可以存储多个相关类型的数据。

共用体是一种特殊的结构体,它的每个成员变量都共享同一段内存空间。

共用体的每个成员变量都有一个基地址,它们之间的关系是连续的。

共用体的大小等于其最大成员变量的大小。

二、结构体和共用体的大小计算方法结构体和共用体的大小计算方法相同,都是按照定义的顺序依次计算每个成员变量的大小,并累加得到总体大小。

需要注意的是,结构体和共用体的大小通常会进行对齐处理,以提高数据访问的效率。

三、例题解析假设有一个结构体如下:```cstruct example {int a;char b;float c;};```首先,我们需要知道每个成员变量的大小。

在 32 位系统下,int 类型占用 4 个字节,char 类型占用 1 个字节,float 类型占用 4 个字节。

因此,结构体 example 的大小为:```size = 4(int a 的大小) + 1(char b 的大小) + 4(float c 的大小)= 9```接下来,我们需要考虑对齐问题。

在 32 位系统下,数据对齐的粒度是 4 个字节。

因此,结构体 example 的大小应该为 4 的倍数。

由于 9 不是 4 的倍数,所以需要进行对齐处理。

将结构体 example 的大小调整为 12,这样每个成员变量都可以从 4 的倍数地址开始存储。

```size = 12```因此,结构体 example 的大小为 12 字节。

C语言共用体(Union)

C语言共用体(Union)

C语⾔共⽤体(Union)结构体和共⽤体的区别在于:结构体的各个成员会占⽤不同的内存,互相之间没有影响;⽽共⽤体的所有成员占⽤同⼀段内存,修改⼀个成员会影响其余所有成员。

结构体占⽤的内存⼤于等于所有成员占⽤的内存的总和(成员之间可能会存在缝隙),共⽤体占⽤的内存等于最长的成员占⽤的内存。

共⽤体使⽤了内存覆盖技术,同⼀时刻只能保存⼀个成员的值,如果对新的成员赋值,就会把原来成员的值覆盖掉。

共⽤体也是⼀种⾃定义类型,可以通过它来创建变量,例如:1. union data{2. int n;3. char ch;4. double f;5. };6. union data a, b, c;上⾯是先定义共⽤体,再创建变量,也可以在定义共⽤体的同时创建变量:1. union data{2. int n;3. char ch;4. double f;5. } a, b, c;如果不再定义新的变量,也可以将共⽤体的名字省略:1. union{2. int n;3. char ch;4. double f;5. } a, b, c;共⽤体 data 中,成员 f 占⽤的内存最多,为 8 个字节,所以 data 类型的变量(也就是 a、b、c)也占⽤ 8 个字节的内存,请看下⾯的演⽰:1. #include <stdio.h>2.3. union data{4. int n;5. char ch;6. short m;7. };8.9. int main(){10. union data a;11. printf("%d, %d\n", sizeof(a), sizeof(union data) );12. a.n = 0x40;13. printf("%X, %c, %hX\n", a.n, a.ch, a.m);14. a.ch = '9';15. printf("%X, %c, %hX\n", a.n, a.ch, a.m);16. a.m = 0x2059;17. printf("%X, %c, %hX\n", a.n, a.ch, a.m);18. a.n = 0x3E25AD54;19. printf("%X, %c, %hX\n", a.n, a.ch, a.m);20.21. return 0;22. }运⾏结果:4, 440, @, 4039, 9, 392059, Y, 20593E25AD54, T, AD54这段代码不但验证了共⽤体的长度,还说明共⽤体成员之间会相互影响,修改⼀个成员的值会影响其他成员。

C程序设计(第四版)第7章结构体与共用体

C程序设计(第四版)第7章结构体与共用体

7.1.1
结构体类型的定义
结构体在说明和使用之前,必须先由用 户自己定义。结构体定义的一般形式如下: struct 结构体名 { 成员类型说明符 成员项1; 成员类型说明符 成员项2; …… 成员类型说明符 成员项n; };
其中: 1、struct是C语言中定义结构体的关键字。 2、成员类型说明符是说明每个成员项的数 据类型,可以是基本数据类型,也可以是数组 类型,还可以是另一个已定义的结构体类型。 3、成员名可以和程序中的变量名相同,两 者不代表同一对象。 4、要注意,在结构体定义中的右括号后应 该有分号。
7.1.6
指向结构体的指针
一个结构体类型的数据在内存中都占据一定 的存储空间,我们可以定义一个指针来指向该 结构体类型的数据,该指针变量称为指向结构 体的指针,简称之为结构体指针。我们可以通 过结构体指针来访问结构体类型的数据,如结 构体变量、结构体数组。指向结构体的指针变 量说明形式如下: struct 结构体类型名 *结构体指针变量名;
main() { struct student stu1; struct student *p; p=&stu1; stu1.num=50201001; gets(); stu1.score=89.5;
printf(“No:%ld\nName:%s\nScore:%4.1f\n”,stu1 .num,,stu1.score); printf(“No:%ld\nName:%s\nScore:%4.1f\n”,(*p). num,(*p).name,(*p).score);
3、结构体数组应用举例 【例7-2】现有三个候选人(每个候选人的ID 号分别是1、2、3),选举人投票进行选举, 编写程序统计出每个候选人的得票结果。 程序如下: #define NUM 30 #include <stdio.h> struct elector { int id; char name[20]; int count;

浅谈C语言共用体和与结构体的区别

浅谈C语言共用体和与结构体的区别

浅谈C语⾔共⽤体和与结构体的区别
共⽤体与结构体的区别
共⽤体:
使⽤union 关键字
共⽤体内存长度是内部最长的数据类型的长度。

共⽤体的地址和内部各成员变量的地址都是同⼀个地址
结构体⼤⼩:
结构体内部的成员,⼤⼩等于最后⼀个成员的偏移量+最后⼀个成员⼤⼩+末尾的填充字节数。

结构体的偏移量:某⼀个成员的实际地址和结构体⾸地址之间的距离。

结构体字节对齐:每个成员相对于结构体⾸地址的偏移量都得是当前成员所占内存⼤⼩的整数倍,如果不是会在成员前⾯加填充字节。

结构体的⼤⼩是内部最宽的成员的整数倍。

共⽤体
#include <stdio.h>
//gcc让不同类型的变量共享内存地址 ,同⼀时间只有⼀个成员有效
union data{
int a;
char b;
int c;
};
int main(){
union data data_1 = {1};//初始化时只填写⼀个值。

(同⼀时间只有⼀个成员有效)
data_1.b = 'c';
data_1.a = 10;//后赋值的才有效。

前⾯的赋值被覆盖
//打印地址,发现指向同⼀个地址
printf("%p\n%p\n%p\n",&data_1.a,&data_1.a,&data_1.a);
return 0;
}
以上这篇浅谈C语⾔共⽤体和与结构体的区别就是⼩编分享给⼤家的全部内容了,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。

C语言程序设计 - 结构体和共用体-样本教案

C语言程序设计 - 结构体和共用体-样本教案
2)通过结构指针引用结构成员变量时,++和--运算对结果的影响:
用以下实例来分析:
struct
{int a;
int *s;
}*p;
第一组引用:对成员变量a的引用
++p->a++(p->a)
说明:成员变量a自增加1.
(++p)->a
说明:指针p先移动一个单位,然后引用对应的成员变量a.
注意: p每移动一个单位要移动多少字节?
格式一:先说明结构类型,再单独进行结构变量定义.
例:
struct student
{ char name[12];
char sex;
sturct date birthday;
float sc[4];
};
struct student std,pers[3],*pstd;
说明:这个例子定义了三个结构类型名为student的结构变量:
这种结构类型变量定义的方式与不省略"结构名"的方式相比,不同之处在于:这种格式定义结构变量以后无法再定义此结构类型的其它结构变量,而带有"结构名"的格式则可以.
格式三:使用typedef说明一个结构类型名,再用新类型名定义结构变量.
例:
typedefstruct
{ char name[12];
char sex;
{"Wang wu" , "F",1983, 3, 3,93,83,73,63}
};
有时结构数组长度可以省略,而由初值个数来暗示.
(4)结构变量成员的引用和操作:
1)对结构变量成员的引用和操作:

C语言第12讲 结构体共用体

C语言第12讲  结构体共用体

§6.3 结构体变量的引用
引用规则
结构体变量不能整体引用,只能引用变量成员
引用方式: 结构体变量名.成员名
例 struct 成员(分量)运算符 student 可以将一个结构体变量赋值给另一个结构体变量 例 struct student { stu1.num=10; int num; 优先级: 结构体嵌套时逐级引用 1 { int num; 例 struct student 结合性:从左向右 { char name[20]; int num; 例 struct name[20]; char sex; char student char name[20]; stu1.score=85.5; 例 structchar num; student { int sex; int char sex; age; printf(“%d,%s,%c,%d,%f,%s\n”,stu1); () if(stu1==stu2) { int age; num; stu1.birthday.month=12; char name[20]; float score; int …….. () stu1.score+=stu2.score; char score; name[20]; int age; struct float date char addr[30]; stu1.age++; float score; char addr[30]; stu1={101,“Wan Lin”,„M‟,19,87.5,“DaLian”}; () sex; { int char month; }stu1,stu2; addr[30]; char birthday int age; int }stu1,stu2; day; num name float score; }stu1,stu2; month day year int year; stu2=stu1; ( ) char addr[30]; }birthday; }stu1,stu2; }stu1,stu2;

C语言第9章结构体、共用体、枚举

C语言第9章结构体、共用体、枚举

结构体变量.成员
struct date { int year;
int month; int day;
“.”是成员运算符, 优先级最高
printf("%d,%d,%d",birth);
printf("%d,%d,%d",birth.year,
}; struct date birth;
birth.month,birth.day);
scanf("%f",&student2.score[2])7; 8
student2
结构变量的整体赋值 student3 = student2;
02 Zhang Zi Liang 88 78
student3
02 Zhang Zi Liang 88 78
湖南工业大学计算机与通信学院
例9-1学生的基本信息包括学号、姓名、3门成绩、平均分、总分。输入一 个学生的前3项基本信息,计算平均分和总分并输出。
湖南工业大学计算机与通信学院
9.1 问题的提出
又如,在学生信息管理系统中填 加个属性:是否是中共党员,如 果不是属性的值为0(int),如
果是属性的值为入党的时间 (char)。在某一时间,属性只有 一种值,而且数据类型不同,这 种情况用什么数据类型描述呢?
对于这种应用,C语言引入了共用体类型。
共用体是一种同一存储区域由不同类型变量共享的数据 类型,它提供—种方法能在同一存储区中操作不同类型 的数据,也就是说共用体采用的是覆盖存储技术,准许 不同类型数据互相覆盖。
基本数据类型并不能方便地解决所有问题
❖ 复合数据类型是基本数据类型迭代派生而来
典型的代表就是“结构”,数组、指针也可算作此类

C语言知识总结——宏,枚举,结构体,共用体

C语言知识总结——宏,枚举,结构体,共用体

C语言知识总结——宏,枚举,结构体,共用体1、define宏定义以#号开头的都是编译预处理指令,它们不是C语言的成分,但是C程序离不开它们,#define用来定义一个宏,程序在预处理阶段将用define定义的来内容进行了替换。

因此在程序运行时,常量表中并没有用define定义的常量,系统不为它分配内存。

define定义的常量,预处理时只是直接进行了替换,,它用来将一个标识符定义为一个字符串,该标识符被称为宏名,被定义的字符串称为替换文本。

,因此在编译时它不对宏的定义进行检查,作用域不影响对常量的访问。

它的常量值只能是字符串或数字。

该命令有两种格式:一种是简单的常量宏定义, 另一种是带参数的宏定义。

不带参数的宏:#define< 名字 >< 值 > 要注意,没有结尾的分号,因为不是C的语句,名字必须是一个单词,值可以是各种东西,宏定义是用宏名来表示一个字符串,在宏展开时又以该字符串取代宏名,这只是一种简单的代换,字符串中可以含任何字符,可以是常数,也可以是表达式,预处理程序对它不作任何检查。

如有错误,只能在编译已被宏展开后的源程序时发现。

注意.宏定义不是说明或语句,在行末不必加分号,如加上分号则连分号也一起置换。

宏定义其作用域为宏定义命令起到源程序结束。

如要终止其作用域可使用#undef命令带参数的宏:像函数的宏,一般的定义形式:带参宏定义的一般形式为:「#define 宏名」(形参表)字符串,也是没有结尾的分号,可以带多个参数,#define NB(a,b)((a)>(b)?(b):(a)), 也可以组合(嵌套)使用其他宏,注意带参数宏的原则一切都要有括号,参数出现的每个地方都要有括号。

带参数的宏在大型的程序的代码中使用非常普遍,在#和##这两个运算符的帮助下可以很复杂,如“产生函数”,但是有些宏会被inline函数代替(C++的函数)使用宏好处:“提高运行效”。

定义的标识符不占内存,只是一个临时的符号,预编译后这个符号就不存在了。

C语言学习入门笔记之结构体与共用体

C语言学习入门笔记之结构体与共用体

结构体与共用体笔记定义结构体C语言允许用户自己建立由不同类型数据组成的组合型的数据结构,它称为结构体(structre)。

在其他一些高级语言中称为“记录”.定义后的结构体类型和系统提供的标准类型(如int, char, float, double 等)具有相似的作用,都可以用来定义变量,只不过int等类型是系统已声明的,而结构体类型是由用户根据需要在程序中指定的。

定义一个结构体类型的一般形式为:struct 结构体名{ 成员表列};注意:1.结构体类型的名字是由一个关键字struct和结构体名组合而成的(例如struct Student) ,结构体名是由用户指定的,又称“结构体标记”,以区别于其他结构体类型。

上面的结构体声明中Student就是结构体名(结构体标记)。

2.花括号内是该结构体所包括的子项,称为结构体的成员。

“成员表列"(member list)也称为“域表”(field list),成员表列由若干个成员组成,每一个成员是结构体中的一个域。

对每个成员也必须作类型说明,其形式为:类型说明符成员名;成员名的命名应符合标识符的书写规定。

例如:struct stu{int num;char name[20];char sex;float score;};3.一个结构体的成员可以属于另一个结构体类型(嵌套)。

例如:struct Date //声明一个结构体类型struct Date{ int month;//月int day;//日int year;//年}struct Student//声明一个结构体类型struct Student{ int num;char name[20];char sex;int age;struct Date birthday;//成员birthday属于struct Date 类型char addr[30];};结构体类型变量1.定义结构体类型变量说明结构变量有以下三种方法。

C语言11结构体与共用体

C语言11结构体与共用体

struct [结构体名]
{
类类结述…型 型结构…不标 标构体…分识 识的类…配符 符组型…内织定.存成 成形义员员式描名名;;
};2020/5/11
struct student { char name[20];
unsigned int nuloat score[3]; }; 3
} 2020/5/11 stu;
7
• 结构体变量的初始化
struct 结构体名
{ 类型标识符 成员名;
struc类t 型stu标de识nt符 成员名; { in…t n…u…m;……. }; char name[20]; strucctha结r 构sex体; 名 结构体变量={初始数据};
int age; strucctha结r a构dd体r[名30]; }{;stu1={112,“Wang Lin”,‘M’,19, “200 Beijing Road”}; struc类t 型stu标de识nt符stu成1=员{11名2,;“Wang Lin”,‘M’,19, “200 Beijing Road”};
类型标识符 成员名;
……………. } 结构体变量={初始数据};
2020/5/11
8
• 结构体数组的定义和内存分配
形式一:
形式二:
struct student
struct student
{ int num;
{ int num;
char name[20];
char name[20];
char sex;
stu[1]
main()
age
{ struct student *p;
num
for(p=stu; p<stu+3; p++)

C语言程序设计 - 结构体和共用体-样本教案

C语言程序设计 - 结构体和共用体-样本教案
struct student类型的数据。
1.用指针处理链表
指向结构体类型数据的指针;用指针处理链表
3.结构变量在函数中的应用
在C语言中,允许结构变量的成员,结构变量的整体和结构变量的地址做为实参传递给相应的形参。
(1)向函数传递结构变量的成员
结构变量的成员作实参
结构变量的成员可以是普通变量,数组或指针变量,它们做实参时的情况同以前七,八,九章所讲。
格式一:先说明结构类型,再单独进行结构变量定义.
例:
struct student
{ char name[12];
char sex;
sturct date birthday;
float sc[4];
};
struct student std,pers[3],*pstd;
说明:这个例子定义了三个结构类型名为student的结构变量:
35个字节
35个字节
35个字节
指向结构类型的指针变量:
如:struct student *pstd;
系统为该指针变量分配一个存放"地址"的4个字节的内存空间,具体该指针变量指向哪个结构类型变量,通过为该指针变量赋予某结构变量地址值来确定.
如下例:
struct student *pstd1,*pstd2,*pstd3;
pstd1=&std;/*pstd1指向结构变量std的首地址*/
pstd2=pers;/*pstd2指向结构数组pers的首地址*/
pstd3=(struct student*)malloc(size of (struct student));
说明:结构变量名不是指向该结构的地址, 这与数组名的含义不同,

c语言第11章-结构体与共用体

c语言第11章-结构体与共用体

}
§11.6 构造体和指针
ma指in向() 构造体变量旳指针
{ s❖tr定uc义t st形ud式en:t struct 构造体名 *构造体指针名; { 例lonsgtruicntt sntuudmen;t *p; char name[20]; ❖使str用ucch构tars造tsued体xe;n指t 针变存量储引构用造组体p员变形量式在内存旳起始地址
struct student stu1={112,“Wang Lin”,‘M’,19, “200 Beijing Roa
形式二:
struct 构造体名
{ 类型标识符 组员名; 类型标识符 组员名;
……………. }构造体变量={初始数据};
例 struct student { int num; char name[20]; char sex; int age; char addr[30]; }stu1={112,“Wang Lin”,‘M’,19, “200 Beijing Road”
❖用构造体变量旳组员作参数----值传递 ❖用指向构造体变量或数组旳指针作参数----地址传递 ❖用构造体变量作参数----多值传递,效率低
例 用构造体变量作函数参数
(main)
struct data { int a, b, c; };
accacbbb::::::::2332333370070
main()
}
指向构造体数组旳指针
例 指向构造体数组旳指针
struct student { int num;
char name[20]; char sex; int age;
p num
name
sex
p+1
age

结构体、共用体、枚举类型、typedef的区别

结构体、共用体、枚举类型、typedef的区别
jh.f). (2)共用体变量中只有最后一次赋值的成员有效,例如 jh.i 赋值 1,然后 jh.f 赋
值 2,此时引用 jh.i 不能取值,已经被 jh.f 覆盖了. (3)共用体变量的地址和它各成员的地址都是同一地址. (4)不能对共用体赋值或引用共用体的变量名取值,也不能在定义共用体变量
时对它初始化. (5)不能把共用体变量作函数参数,也不能使函数返回共用体变量,但可以使
引用: p = cd; 为枚举型变量 p 赋值 cd,p 的值就是成员表列中 cd 的值. 可以理解为 p = 2;,但是 2 是整型常量,要先强制类型转换,写成 p = (enum
jh)2;. 枚举型变量可以用作判断比较,if(p > (enum jh)1)或 if(p > bc).
-------------------------------------------------------------------------------------------------typedef
(2)直接定义结构体类型变量.方法为声明类型的同时定义变量,并且不写结构 体名 jh,这种方法用于只定义 1 次变量,而且每用这种方法定义 1 个变量,虽然都 为无名结构体类型,但不属于同一类型.
引用结构体类型变量: 结构体变量名.成员名
例:
struct jh{int ห้องสมุดไป่ตู้;char b;}a; a.b = 'z';
enum jh{ab=1,bc=2,cd=3,de=4}; 或
enum jh{de=4,ab,bc,cd}; 其中(de=4,ab,bc,cd)就是把最后一个 de 作为 0 放在最前面,然后改变值为最 后一位的值,第二开始就是从 1 算起了.

C语言程序设计 Chapter8 结构体与共用体

C语言程序设计 Chapter8 结构体与共用体

struct date_type { int year; 结构体数组 int month; int day; 结构体数组的定义 }; ; struct stud_type { char name[10]; long num; char sex; struct date_type birthday; float score; char address[10]; }s1[3]; struct stud_type s2[5];
struct ym_type { 输入一个职工的工资信息, 例. 输入一个职工的工资信息,整体 int y; 赋值给另一个变量,在屏幕上输出。 赋值给另一个变量,在屏幕上输出。 int m; }; struct salary_type { char num[5]; char name[17]; struct ym_type ym; float salary; float other; float cost; };
#define N 5
char name[11]; int score; }t,s[N]; main() { /*输入基本信息 输入基本信息*/ 输入基本信息 /*选择排序成绩 选择排序成绩*/ 选择排序成绩 /*输出基本信息 输出基本信息*/ 输出基本信息 }
/*选择排序成绩 选择排序成绩*/ 选择排序成绩 for(i=0;i<N-1;i++) { k=i; for(j=i+1;j<N;j++) if(s[k].score<s[j].score) k=j; if(k!=i) { t=s[i]; s[i]=s[k]; s[k]=t; } }
第8章 结构体与共用体
概述
在事务处理中,常需要将一些关系密切但 在事务处理中 常需要将一些关系密切但类型不同的 并为其取一个整体名字, 数据项组织在一起,并为其取一个整体名字,形成一 并为其取一个整体名字 个结构。 语言中,就称其为 个结构。 语言中 就称其为结构体。 C语言中 结构体通常由不同数据类型的数据项(成员)组成 组成 一个结构体可包含若干成员,每个成员具有自己 一个结构体可包含若干成员 每个成员具有自己 的名字及数据类型。 的名字及数据类型。

C语言结构体共用体和动态内存分配

C语言结构体共用体和动态内存分配

C语言结构体共用体和动态内存分配共用体是一种特殊的数据类型,可以存储不同类型的数据,但是同一时间只能存储其中的一个成员。

共用体的内存空间是所有成员的最大字节长度。

动态内存分配是在程序运行时,根据需要动态地分配和释放内存空间。

下面将详细介绍C语言中的结构体、共用体和动态内存分配。

结构体是C语言中一种用户自定义的数据类型,它可以同时存储不同类型的数据,使得数据处理更加灵活方便。

结构体由多个不同类型的成员变量组成,每个成员变量可以拥有不同的数据类型。

结构体的定义以关键字struct开头,后面是结构体名称及其成员变量列表。

以下是一个结构体的例子:```cstruct Personchar name[20];int age;float height;};```定义了一个名为Person的结构体,包含了三个成员变量:name、age 和height。

其中name是一个字符数组,age是一个整数,height是一个浮点数。

我们可以通过`.`操作符访问结构体的成员变量:```cstruct Person p;strcpy(, "Tom");p.age = 20;p.height = 1.80;```上述代码中,我们定义了一个结构体Person的变量p,并为其成员变量赋值。

而共用体(union)是一种特殊的数据类型,它可以在相同的内存空间中存储不同的数据类型。

共用体的定义以关键字union开头,后面是共用体名称及其成员变量列表。

以下是一个共用体的例子:```cunion Dataint num;char name[20];float marks;};```定义了一个名为Data的共用体,包含了三个成员变量:num、name 和marks。

共用体的大小取决于其中最大的成员变量,以便为最大的成员分配足够的存储空间。

我们可以通过`.`操作符访问共用体的成员变量:union Data d;d.num = 10;strcpy(, "John");d.marks = 85.5;```上述代码中,我们定义了一个共用体Data的变量d,并为其成员变量赋值。

C语言 第八章 结构体

C语言 第八章 结构体

共用体
3)直接定义联合变量 union {
int i;
float f; }num; 说明:(1)共用体变量的所有成员占有同一段内存,所占内存空 间是其成员中字节数最大的成员占有的字节数。
(2)共用体变量中可以定义许多不同类型的成员,但同一时刻只
有一个成员的数据有效。
共用体
4.共用体变量初始化 初始化时,只能对第一个成员的数据类型初始化。 例:union data num={10}; 正确 union data num={10,25.4}; 错误
结构体变量
方法三:定义结构体类型的同时定义结构体变量,省略结构体类型名
struct DATE{ int year; int month; int day;}; struct {
long int number;
char name[8]; int age;
char *sex;
struct DATE birthday; }stu1,stu2;
数据类型
数据类型
成员名1;
成员名2;
//成员表
……
};
结构体类型
2.结构体类型的定义: 说明: (1) struct是关键字,标识一个结构体类型定义的开头 (2)“结构体类型名”是表示该结构体类型的名称的标识符,可
类比int、char
(3)“成员表”是构成结构体类型的成份,由一个或多个成员构
成,每个成员有自己的成员名。各成员数据类型可以不同,既可以
枚举类型
3.枚举变量定义
方式一:类型和变量分开定义 enum WEEKDAY{Sun,Mon,Tue,Wed,Thu,Fri,Sat};//定义枚举类型 enum WEEKDAY w;//定义枚举变量w

结构体和共用体 注意事项

结构体和共用体 注意事项

结构体和共用体注意事项以结构体和共用体为主题,本文将介绍一些需要注意的事项。

结构体和共用体是C语言中非常重要的数据类型,它们可以用来组织和存储不同类型的数据。

在使用结构体和共用体时,需要注意以下几点。

一、结构体的定义和使用结构体是一种自定义的数据类型,它能够将不同类型的数据组合在一起。

在定义结构体时,需要使用关键字struct,并为结构体定义一个名称。

结构体中的成员可以是不同的数据类型,可以是基本类型(如int、float等),也可以是其他结构体类型。

在使用结构体之前,需要先定义结构体的类型。

定义结构体类型的方式如下:```struct Student {char name[20];int age;float score;};```在定义结构体类型后,可以使用该类型创建结构体变量,并对结构体的成员进行赋值。

例如:```struct Student stu1;strcpy(, "Tom");stu1.age = 18;stu1.score = 90.5;```需要注意的是,在访问结构体的成员时,需要使用点操作符(.)来访问成员。

例如,访问stu1的name成员可以使用``,访问stu1的age成员可以使用`stu1.age`。

二、共用体的定义和使用共用体(union)与结构体类似,也是一种自定义的数据类型,可以将不同类型的数据组合在一起。

不同之处在于,共用体的所有成员共享同一块内存空间。

共用体的定义方式与结构体类似,也需要使用关键字union,并为共用体定义一个名称。

共用体中的成员可以是不同的数据类型,但是共用体的所有成员共享同一块内存空间。

使用共用体时,需要注意以下几点:1. 共用体的所有成员占用的内存空间是相同的,因此共用体的大小等于最大成员的大小。

2. 在给共用体的成员赋值时,只能对一个成员进行赋值,对其他成员的赋值会改变已经赋值的成员的值。

下面是一个共用体的定义和使用的示例:```union Data {int num;char ch;float score;};```在定义共用体类型后,可以使用该类型创建共用体变量,并对共用体的成员进行赋值。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

/2005/03/25/12365.html
所谓共用体类型是指将不同的数据项组织成一个整体,它们在内存中占用同一段存储单元。

其定义形式为:
union 共用体名
{成员表列};
7.5.1 共用体的定义
union data
{
int a ;
float b ;
d o u b l
e c ;
c h a r
d ;
} obj;
该形式定义了一个共用体数据类型union data ,定义了共用体数据类型变量o b j。

共用体
数据类型与结构体在形式上非常相似,但其表示的含义及存储是完全不同的。

先让我们看一个小例子。

[例7 - 8 ]
union data /*共用体* /
{
int a;
float b;
double c;
char d;
} m m ;
struct stud /*结构体* /
{
int a;
float b;
double c;
char d;
} ;
m a i n ( )
{
struct stud student
printf("%d,%d",sizeof(struct stud),sizeof(union data));
}
程序的输出说明结构体类型所占的内存空间为其各成员所占存储空间之和。

而形同结构体的
共用体类型实际占用存储空间为其最长的成员所占的存储空间。

详细说明如图7 - 6所示。

对共用体的成员的引用与结构体成员的引用相同。

但由于共用体各成员共用同一段内存
空间,使用时,根据需要使用其中的某一个成员。

从图中特别说明了共用体的特点,方便程序设计人员在同一内存区对不同数据类型的交替使用,增加灵活性,节省内存。

7.5.2 共用体变量的引用
可以引用共用体变量的成员,其用法与结构体完全相同。

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

[例7-9] 对共用体变量的使用。

m a i n ( )
{
union data
{
int a;
float b;
double c;
char d;
} m m ;
m m . a = 6 ;
printf("%d\n",mm.a);
m m . c = 6 7 . 2 ;
p r i n t f ( " % 5 . 1 l f \ n " , m m . c ) ;
m m . d = ' W ' ;
m m . b = 3 4 . 2 ;
p r i n t f ( " % 5 . 1 f , % c \ n " , m m . b , m m . d ) ;
}
程序最后一行的输出是我们无法预料的。

其原因是连续做m m . d = ' W ';m m . b = 3 4 . 2;两个
连续的赋值语句最终使共用体变量的成员m m . b所占四字节被写入34 .2,而写入的字符被覆盖
了,输出的字符变成了符号“ =”。

事实上,字符的输出是无法得知的,由写入内存的数据决
定。

例子虽然很简单,但却说明了共用体变量的正确用法。

[例7-10] 通过共用体成员显示其在内存的存储情况。

定义一个名为t i m e的结构体,再定义共用体d i g:
struct time
{
int year; / *年* /
int month;/ *月* /
int day; / *日* /
} ;
union dig
{
struct time data; /*嵌套的结构体类型* /
char byte[6];
} ;
假定共用体的成员在内存的存储是从地址1 0 0 0单元开始存放,整个共用体类型需占存储空间6个字节,即共用体d i g的成员d a t a与b y t e共用这6个字节的存储空间,存储空间分配示意如图7 - 7所示。

由于共用体成员d a t a包含三个整型的结构体成员,各占2个字节。

由图7 - 7所示可见,d a t a . y e a r是由2个字节组成,用b y t e字符数组表示为b y t e [ 0 ]和byte[1] 。

b y t e [ 1 ]是高字节,
b y t e [ 0 ]是低字节。

下面用程序实现共用体在内存中的存储。

struct time
{
int year; /*年* /
int month; / *月* /
int day; / *日* /
} ;
union dig
{
struct time data; /*嵌套的结构体类型* /
char byte[6];
} ;
m a i n ( )
{
union dig unit;
int i;
printf("enter year:\n");
s c a n f ( " % d " , & u n i t . d a t a . y e a r ) ; / *输入年* /
printf("enter month:\n");
s c a n f ( " % d " , & u n i t . d a t a . m o n t h ) ; / * 输入月* /
printf("enter day:\n");
s c a n f ( " % d " , & u n i t . d a t a . d a y ) ; / *输入日* /
p r i n t f ( " y e a r = % d month=%d day=%d\n", unit.data.year,unit. data. month, unit.
d a t a . d a y ) ; / *打印输出* /
f o r ( i = 0 ; i < 6 ; i + + )
p r i n t f ( " % d , " , u n i t . b y t e [ i ] ) ; / *按字节以十进制输出* /
p r i n t f ( " \ n " ) ;
}
从程序的输出结果来看,1 9 7 6占两个字节,由第0、1字节构成,即7×2 5 6 + 1 8 4 = 1 9 7 6。

4 同样占两个字节,由第2、3字节构成,0×2 5 6 + 4 = 4,2 3由第4、5字节构成,2 3 = 0×2 5 6 + 2 3。

相关文档
最新文档