结构体与共用体小结
结构体与共用体小结
结构体与共用体小结一,结构体得概念与定义1,结构体得定义struct 结构体名{数据类型成员名1;数据类型成员名1;、、、};这里数据类型可以就是复合类型,例如又就是一个结构体类型,即嵌套;2,结构体变量得定义struct 结构体名变量名1,变量名2,,,变量名n;或:struct 结构体名{数据类型成员名1;数据类型成员名1;、、、}结构体变量1,结构体变量2;或:struct{数据类型成员名1;数据类型成员名1;、、、}结构体变量1,结构体变量2;三种方式,第三种方式得话,每次要定义这个类型得结构体变量都要重复得写这一段代码;其实定义了结构体后,struct 结构体名就就是一种新得类型,上述语句就像声明变量一样;3,结构体变量得引用只能对结构体变量中得各个成员分别输出,不能对一个结构体变量作为一个整体输出;嵌套得结构体类型得引用:结构体变量名、结构体类型成员名、内嵌结构体得成员名;4,结构体变量得初始化struct 结构体名变量名= {初始化数据};或者在定义得时候就初始化: struct 结构体名{数据类型成员名1;数据类型成员名1;、、、}变量名= {初始化数据};二,结构体数组1,结构体数组得定义举例struct stu{int stu_nu;char name[20];float score;};struct stu student[5];或者:struct stu{int stu_nu;char name[20];float score;}student[5];或者:struct{int stu_nu;char name[20];float score;}student[5];跟定义结构体变量得三种形式就是一样得,只不过这里每次定义得结构体变量就是一个数组;每一个student[i]都就是struct stu类型得;2,结构体数组得初始化与引用略;三,结构体与指针1,指向结构体得指针得定义,同上,也就是三种形式;struct employees employee1,*p1;或者:struct employees、、、}employee1,*p1;或者:struct{、、、}employee1,*p1;然后可进行如下操作:p1 = &employee1;此时p1指向首地址;2,用结构体变量指针来引用结构体成员得两种操作:(*结构体变量得指针名)、成员名;如:(*p1)、name;括号不能省略,、得优先级就是最高得;或:结构体变量得指针名>成员名;如:p1>name;注意、与>得优先级就是最高得;employee1、name;(*p1)、name;p1>name;就是等价得;3,结构体数组与指针struct stu{int stu_nu;char name[20];float score;}student[5],*p;此时可以(1)把数组student得起始地址赋给p:p = student;此时p指向student[0];(2)也可把student得其她元素得地址赋给pp = &student[3];(3)利用指针移动如p++使p指向结构体数组得不同元素;四,结构体作为函数参数1,结构体变量作为函数参数2,指向结构体变量得指针作为函数参数略,在后续文章里将给出一个例子;共用体得概念在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语言结构体与共同体C语言中结构体和共同体是两种用于组织和管理数据的重要概念。
它们可以帮助程序员更有效地管理和操作数据,提高程序的可读性和可维护性。
一、结构体(Structures)结构体是一种由不同类型的数据成员组成的数据类型,它允许程序员将不同类型的数据组织在一起并使用一个名称来引用它们。
结构体可以包含各种数据类型,例如整数、字符、数组或甚至其他结构体。
结构体的定义通过使用关键字struct来实现。
例如,下面的代码定义了一个名为Person的结构体,其中包含姓名、年龄和性别这三个成员:```cstruct Personchar name[50];int age;char gender[10];};```结构体定义可以在程序的任何地方,通常在函数外部定义,使得它在整个程序中都可见。
结构体的创建和初始化可以使用以下格式:```cstruct Person p1; // 创建名为p1的结构体变量struct Person p2 = {"John", 25, "Male"}; // 创建名为p2的结构体变量并初始化其成员```结构体成员可以通过`.`操作符来访问,例如:```cprintf("Name: %s\n", );```结构体可以作为函数的参数传递,也可以作为函数的返回值。
通过传递结构体作为参数,可以避免传递多个参数,提供了一种有效地传递多个相关数据的方法。
例如,下面的代码演示了一个函数,该函数接受一个名为p的Person结构体作为参数,并打印出其成员的值:```cvoid printPerson(struct Person p)printf("Name: %s\n", );printf("Age: %d\n", p.age);printf("Gender: %s\n", p.gender);```二、共同体(Unions)共同体是一种特殊类型的结构体,它允许不同类型的成员共享同一块内存空间。
C语言中的结构体和共用体(联合体)
C语言中的结构体和共用体(联合体)/c-pointer-array/在C 语言中,结构体(struct)是一个或多个变量的集合,这些变量可能为不同的类型,为了处理的方便而将这些变量组织在一个名字之下。
由于结构体将一组相关变量看作一个单元而不是各自独立的实体,因此结构体有助于组织复杂的数据,特别是在大型的程序中。
共用体(union),也称为联合体,是用于(在不同时刻)保存不同类型和长度的变量,它提供了一种方式,以在单块存储区中管理不同类型的数据。
今天,我们来介绍一下C 语言中结构体和共用体的相关概念和使用。
结构体 / struct结构体的定义声明一个结构体类型的一般形式为:struct 结构体名 {成员列表};其中,成员列表中对各成员都应进行类型声明,即:类型名成员名;例如,我们需要在程序中记录一个学生(student)的数据,包括学号(num)、姓名(name)、性别(sex)、年龄(age)、成绩(score)、地址(addr)等,如下图所示:如果要表示图中的数据结构,但C 语言并没有提供这种现成的数据类型,因此我们需要用定义一种结构体类型来表示。
truct student {int num;char name[20];char sex;int age;float score;char addr[30];};上述定义了一个新的结构体类型 struct student(注意,struct 是声明结构体类型时所必须使用的关键及,不能省略),它向编译系统声明,这是一个“结构体类型”,它包括 num、name、sex、age、score、addr 等不同类型的数据项。
应当说,这里的 struct student 是一个类型名,它与系统提供的标准类型(如 int、char、float、double 等)具有同样的作用,都可以用来定义变量的类型。
结构体变量前面只是声明了一个结构体类型,它相当于一个模型,但其中并无具体的数据,编译系统对其也不分配实际的内存单元。
c语言结构体与共用体之间的区别
/2005/03/25/12365.html所谓共用体类型是指将不同的数据项组织成一个整体,它们在内存中占用同一段存储单元。
其定义形式为:union 共用体名{成员表列};7.5.1 共用体的定义union data{int a ;float b ;d o u b le c ;c h a rd ;} 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 studentprintf("%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但是要注意的是,不能同时引用四个成员,在某一时刻,只能使用其中之一的成员。
结构体与共用体zlh
结构体中每个成员可以是不同的 数据类型,而共用体中所有成员 必须是相同的数据类型。
结构体与共用体的区别与联系
• 使用方式:结构体中每个成员都可以单独访问和操作,而 共用体中一次只能使用其中一个成员。
结构体与共用体的区别与联系
自定义类型
结构体和共用体都是用户自定义的数据类型 ,可以根据需要组合不同的数据类型。
对于大型结构体和共用体,可以使用指针成 员来减少直接内存占用。
在跨平台编程时,要注意不同平台下的内存 对齐规则可能不同,需要进行相应的调整。
05
结构体与共用体的应用案例
案例一:使用结构体实现学生信息管理
定义学生结构体
包含学生姓名、学号、性别、年龄等字段。
创建学生信息数组
根据学生数量,创建相应大小的学生信息数组。
访问速度较慢
访问结构体的成员变量时,需要通过 指针或引用等方式进行间接访问,相 对于直接访问基本数据类型,速度较 慢。
结构体与共用体的优缺点分析
内存占用小
共用体中的所有成员变量共享同一块内存空间,因此相对于 结构体,共用体的内存占用较小。
访问速度快
访问共用体的成员变量时,可以直接通过内存地址进行访问 ,速度较快。
封装性好
结构体可以将多个变量封装在一起,形成一个自定义的数据类型,方便数据的 处理和管理。
结构体与共用体的优缺点分析
• 可扩展性强:结构体可以方便地添加或删除成员 变量,以适应不同的应用场景和需求。
结构体与共用体的优缺点分析
内存占用较大
由于结构体中每个成员变量都占用独 立的内存空间,因此相对于基本数据 类型,结构体的内存占用较大。
赋值给共用体变量
可以给共用体的任何一个成员赋值,如`data.f = 3.14;`,表示将 `data`的`f`成员赋值为3.14。
结构体和共用体
num
name
birthday
month
day
year
stu1.birthday.month=12;
例 struct student { int num; char name[20]; char sex; int age; float score; char addr[30]; }stu1,stu2;
直接定义结构体变量 一般形式:
{ 类型标识符 成员名; 类型标识符 成员名; ……………. }变量名表列;
struct
{ int num; char name[20]; char sex; int age; float score; char addr[30]; }stu1,stu2;
形式二:
struct 结构体名 { 类型标识符 成员名; 类型标识符 成员名; ……………. }结构体变量={初始数据};
例 struct student { int num; char name[20]; char sex; int age; char addr[30]; }stu1={112, "Wang Lin", 'M',19, "200 Beijing Road"};
成员类型可以是 基本型或构造型
struct是关键字, 不能省略
合法标识符 可省:无名结构体
例 struct student { int num; char name[20]; char sex; int age; float score; char addr[30]; };
顺序初始化: struct student { int num; char name[20]; char sex; int age; }; struct student stu[ ]={100, "Wang Lin", 'M',20, 101, "Li Gang", 'M',19, 110, "Liu Yan", 'F',19};
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语言引入了共用体类型。
共用体是一种同一存储区域由不同类型变量共享的数据 类型,它提供—种方法能在同一存储区中操作不同类型 的数据,也就是说共用体采用的是覆盖存储技术,准许 不同类型数据互相覆盖。
基本数据类型并不能方便地解决所有问题
❖ 复合数据类型是基本数据类型迭代派生而来
典型的代表就是“结构”,数组、指针也可算作此类
结构体实验总结
结构体实验总结结构体是一种用户自定义的数据类型,可以将不同类型的数据组合在一起,形成一个新的数据类型。
在编程中,结构体非常有用,因为它使得数据的组织和存储更加灵活,方便进行操作和管理。
在本次实验中,我对结构体的使用进行了实验,并总结以下内容。
首先,在实验中,我学会了如何定义和声明一个结构体。
结构体的定义使用关键字“struct”,之后是结构体的名称和一对花括号,花括号中是结构体的成员。
每个成员有一个类型和一个名称,中间用逗号隔开。
通过这种方式,我可以定义具有不同成员的结构体,并使用它们来组织和管理数据。
其次,在实验中,我深入理解了结构体的作用和优点。
结构体的主要作用是将相关的数据组合在一起,形成一个逻辑上的整体。
这样可以方便地对这些数据进行处理,比如传递给函数或者进行操作。
另外,结构体还可以通过使用指针的方式来传递,以提高程序的效率。
结构体的优点在于可以使程序的逻辑更加清晰,代码更加简洁,提高了程序的可读性和可维护性。
然后,在实验中,我学习了如何使用结构体的成员。
在使用结构体的成员时,可以使用“.”操作符来访问成员。
需要注意的是,访问结构体成员需要通过结构体的实例来进行,所以要先创建一个结构体的实例,然后使用“.”操作符来访问成员。
这样,通过访问结构体的成员,我可以实现对结构体中数据的操作和处理。
此外,在实验中,我还了解了结构体的嵌套和指向结构体的指针。
结构体的嵌套是指一个结构体中可以包含另一个结构体作为成员。
通过结构体的嵌套,可以实现更复杂的数据组织和管理。
指向结构体的指针是指指针变量可以指向一个结构体的实例,通过指针可以直接操作和修改结构体中的数据。
结构体的嵌套和指向结构体的指针使得结构体的使用更加灵活和强大。
最后,在实验中,我通过多个实例的练习,巩固了对结构体的理解和应用。
练习包括定义和声明结构体,创建结构体的实例,访问和修改结构体的成员,以及使用结构体的嵌套和指针。
通过这些练习,我掌握了结构体的使用技巧,能够灵活地运用结构体来组织和管理数据。
C语言知识总结——宏,枚举,结构体,共用体
C语言知识总结——宏,枚举,结构体,共用体1、define宏定义以#号开头的都是编译预处理指令,它们不是C语言的成分,但是C程序离不开它们,#define用来定义一个宏,程序在预处理阶段将用define定义的来内容进行了替换。
因此在程序运行时,常量表中并没有用define定义的常量,系统不为它分配内存。
define定义的常量,预处理时只是直接进行了替换,,它用来将一个标识符定义为一个字符串,该标识符被称为宏名,被定义的字符串称为替换文本。
,因此在编译时它不对宏的定义进行检查,作用域不影响对常量的访问。
它的常量值只能是字符串或数字。
该命令有两种格式:一种是简单的常量宏定义, 另一种是带参数的宏定义。
不带参数的宏:#define< 名字 >< 值 > 要注意,没有结尾的分号,因为不是C的语句,名字必须是一个单词,值可以是各种东西,宏定义是用宏名来表示一个字符串,在宏展开时又以该字符串取代宏名,这只是一种简单的代换,字符串中可以含任何字符,可以是常数,也可以是表达式,预处理程序对它不作任何检查。
如有错误,只能在编译已被宏展开后的源程序时发现。
注意.宏定义不是说明或语句,在行末不必加分号,如加上分号则连分号也一起置换。
宏定义其作用域为宏定义命令起到源程序结束。
如要终止其作用域可使用#undef命令带参数的宏:像函数的宏,一般的定义形式:带参宏定义的一般形式为:「#define 宏名」(形参表)字符串,也是没有结尾的分号,可以带多个参数,#define NB(a,b)((a)>(b)?(b):(a)), 也可以组合(嵌套)使用其他宏,注意带参数宏的原则一切都要有括号,参数出现的每个地方都要有括号。
带参数的宏在大型的程序的代码中使用非常普遍,在#和##这两个运算符的帮助下可以很复杂,如“产生函数”,但是有些宏会被inline函数代替(C++的函数)使用宏好处:“提高运行效”。
定义的标识符不占内存,只是一个临时的符号,预编译后这个符号就不存在了。
结构体、共用体和枚举类型数据余
03
枚举类型概述
枚举类型定义与特点
定义:枚举类型是一种用户自定义的数 据类型,它允许用户为一组整数值分配 有意义的名称。
枚举类型中的标识符具有常量性质,不 能被赋值。
枚举类型属于构造类型,而不是基本类 型。
特点
枚举类型的变量只能取枚举说明结构中 的某个标识符所代表的值。
枚举变量声明与赋值
声明
枚举变量的声明与结构体变量的声明类似,需要指定枚举类型名称和变量名称。
通过函数和模块化设计,将重复的代码和数 据封装成独立的函数或模块,避免数据的重 复出现。例如,将常用的功能和数据处理过 程封装成函数库或模块,提高代码的复用性 和可维护性。
05
结构体、共用体和枚举类型在数据 余处理中应用
结构体在数据余处理中作用
数据整合
结构体可以将多个不同类型的数据整合在一 起,形成一个新的数据类型,方便数据的统 一管理和处理。
赋值
枚举变量可以被赋予枚举说明结构中的某个标识符所代表的值,也可以被赋予 与这些值对应的整数值。
枚举类型应用场景
用于表示一组固定的、预定义 的常量值,如一周的七天、颜
色名称等。
用于替代魔法数字,提高代码 的可读性和可维护性。
用于定义状态机中的状态,使 得状态转换更加清晰和易于理 解。
用于实现位标志,通过组合不 同的标志位来表示不同的选项 或状态。
提高可读性
枚举类型的名称通常具有描述性,可以提高代码的可读性和可维 护性。
06
总结与展望
结构体、共用体和枚举类型重要性总结
结构体(Struct)重要性 结构体允许将多个不同类型的数据组合成一个单一类型,使得数据处理更为方便。
结构体可以提高代码的可读性和可维护性,降低出错率。
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++中的共用体(union)结构解析与结构体(struct)共用体(union)的区别
C++中的共用体(union)结构解析与结构体(struct)共用体(union)的区别C++中的共用体(union)结构解析与结构体(struct)共用体(union) 的区别分类: C++开发博文 2012-04-10 09:58 969人阅读评论(1) 收藏举报structc++c共用体(union)一、基础概念有时需要使几种不同类型的变量存放在同一段内存单元中。
虽然在同一段内存中不同数据类型所占字节数不同,但都从同一地址开始存放,也就是使用了覆盖技术,几个变量互相覆盖。
这种使几个不同的变量共占一段内存的结构,称为共同体类型的结构(也称为联合类型)。
二、声明共用体类型的一般形式:union 共用体类型名{成员表列};定义共用体变量的一般形式:共用体类型名共用体变量名;也可以在声明共用体类型的同时定义共用体变量,也可以没有共用体类型名直接定义共用体变量。
union data{int i;char ch;double d;}a,b,c;三、“共用体”与“结构体”区别结构体变量所占内存长度是各成员占的内存长度之和。
每个成员分别占有其自己的内存单元。
共用体变量所占的内存长度等于最长的成员的长度。
四、对共用体变量的访问方式不能直接引用共用体变量,只能引用共用体变量中的成员。
a.i; a.ch a.f不能引用共用体变量:cout<<a;五、共用体类型数据的特点1、使用共用体变量的目的是希望在同一个内存段存放几种不同类型的数据。
注意:在每一瞬时只能存放其中一种,而不是同时存放多种。
换句话说,每一瞬时只有一个成员起作用,其他成员不起作用。
2、能够访问的是共用体变量中最后一次被赋值的成员,在对一个新的成员赋值后原有的成员就失去作用。
因此在引用共用体变量时应注意当前在共用体变量中起作用的是哪个成员。
3、共同体变量的地址和它的各成员的地址相同,为同一个地址。
4、不能对共用体变量名赋值;不能引用变量名来得到一个值;不能在定义共用体变量时对它初始化;不能用共用体变量名作为函数参数。
C语言程序设计实验结构体与共用体
实验8:结构体与共用体一、实验目的1.掌握结构体类型变量的定义和使用;2.掌握共用体的概念与使用。
二、实验内容编写程序,实现如下功能:1.定义结构体变量,用它表示考生的学号、姓名(用英文表示)以及语文、数学、外语成绩。
输入两个考生的信息和各门课成绩并比较(按总分进行高低排序;当总分相同时,依次按语、数、外的顺序排序)。
2.设有一个教师与学生通用的表格,数据项包括:姓名、年龄、职业和单位,其中“职业”一项可分为“教师”和“学生”两类;对“单位”一项,教师填入“系部名称”(用字符类型表示),学生填入“班级编号”(用整型量表示)。
编程输入人员数据,再以表格输出。
三、实验结果记录第1题上机调试后的最终代码及上机调试结果(截图):程序代码运行结果1.总分不同2.总分相同的情况2.1总分完全相同2.2总分相同但语文成绩不同2.3总分相同、语文成绩相同但数学成绩不同第2题上机调试后的最终代码及上机调试结果(截图):程序代码运行结果1.正确输入2.错误输入四、实验小结:经过此次实验,我熟悉掌握了结构体的定义和使用,同时也掌握了共用体的使用。
对于程序1,基本思路是通过结构体定义变量,采用if-else语句嵌套,当总分相同且语文数学成绩均相同时就不必再进行一轮的if语句判断,因为此时两考生的英语成绩一定相同。
对于程序2,在结构体中定义了共用体,可对不同职业进行不同单位的划分。
基本思路是用malloc函数进行动态内存分配,确定要输入的样本数量,再进行数据的输入,在单位数据的输入时需要判断输入对象是学生还是老师,此时要用strcmp函数进行比较判断,输入结束后打印表格,用转义字符\t让表格更加美观,最后通过free进行内存释放。
结构体与共用体小结
结构体与共用体小结结构体和共用体是C语言中非常重要的数据类型。
它们在存储和组织数据方面提供了更灵活的选择。
本文将从定义、声明、初始化、使用和比较等方面对结构体和共用体进行详细讨论。
一、结构体(Struct)结构体是一种能够存储不同类型数据的自定义数据类型。
它允许将不同类型的数据组合在一起,形成一个逻辑上的实体。
1.定义和声明结构体的定义使用关键字`struct`,可以像定义其他变量一样定义结构体。
例如:```cstruct Studentint id;char name[20];int age;};```在定义结构体后,可以使用该结构体类型声明变量。
例如:```cstruct Student stu1;```也可以一步完成结构体类型定义和变量声明。
例如:```cstruct Studentint id;char name[20];int age;} stu1;```2.初始化结构体变量可以使用初始化列表初始化。
例如:```cstruct Student stu1 = {1001, "John", 20};```3.使用结构体变量的成员可以通过`.`运算符访问。
例如:```cstu1.id = 1001;strcpy(, "John");stu1.age = 20;```4.比较结构体不能直接比较,但可以通过定义比较函数来比较。
例如:```creturn (stu1.id == stu2.id && strcmp(, ) == 0 && stu1.age == stu2.age);```二、共用体(Union)共用体是一种特殊的数据类型,它允许不同类型的成员共享同一块内存空间。
共用体的成员在内存中是相互重叠的,只有一个成员可以被赋值和使用。
1.定义和声明共用体的定义使用关键字`union`,可以像定义其他变量一样定义共用体。
例如:```cunion Dataint i;float f;char str[20];};```在定义共用体后,可以使用该共用体类型声明变量。
结构体与共用体小结
结构体与共用体小结结构体与共用体小结一,结构体得概念与定义1,结构体得定义struct结构体名{数据类型成员名1;数据类型成员名1;、。
};这里数据类型可以就是复合类型,例如又就是一个结构体类型,即嵌套;2,结构体变量得定义struct 结构体名变量名1,变量名2,,,变量名n;或:struct结构体名{数据类型成员名1;数据类型成员名1;。
、}结构体变量1,结构体变量2;或:struct{数据类型成员名1;数据类型成员名1;。
、}结构体变量1,结构体变量2;三种方式,第三种方式得话,每次要定义这个类型得结构体变量都要重复得写这一段代码;其实定义了结构体后,struct 结构体名就就是一种新得类型,上述语句就像声明变量一样;3,结构体变量得引用只能对结构体变量中得各个成员分别输出,不能对一个结构体变量作为一个整体输出;嵌套得结构体类型得引用:结构体变量名。
结构体类型成员名、内嵌结构体得成员名;4,结构体变量得初始化struct 结构体名变量名= {初始化数据};或者在定义得时候就初始化: struct结构体名{数据类型成员名1;数据类型成员名1;。
、、}变量名= {初始化数据};二,结构体数组1,结构体数组得定义举例struct stu{int stu_nu;char name[20];floatscore;};struct stu student[5];或者:struct stu{int stu_nu;char name[20];float score;}student[5];或者:struct{int stu_nu;char name[20];float score;}student[5];跟定义结构体变量得三种形式就是一样得,只不过这里每次定义得结构体变量就是一个数组;每一个student[i]都就是struct stu类型得;2,结构体数组得初始化与引用略;三,结构体与指针1,指向结构体得指针得定义,同上,也就是三种形式;struct employeesemployee1,*p1;或者:struct employees、。
结构体~共用体
第十一章结构体与共用体§11.1 结构体类型的定义11.1.1 概述在此之前,除数组外的基本变量都是属于非构造类型的数据。
数组是一种构造类型数据。
本章介绍另两种构造类型的数据——结构体和共用体。
C语言中的结构体相当于其他高级语言中的“记录”,它可以把多种类型的数据组合在一起,构成一个整体,一种新类型的数据,从而适应复杂类型数据的要求。
11.1.2 结构体类型的定义1、定义struct 结构体名{成员1;成员2;......成员n;}; /*只定义类型时,最后一行上的“;”不可缺少*/ 其中:结构体名称为该结构体标记。
成员称为结构体域(集合称为域表),其构成为“类型名成员名”,成员名构成规则与变量名相同。
2、结构体变量的存储空间分配各个成员所占字节数之和,即是该变量所需字节数。
3、结构体类型的定义示例见教材P260。
§11.2结构体类型变量的定义可以用三种方法定义结构体类型变量。
11.2.1 先声明结构体类型,再定义变量1、先定义一个结构体类型,其中student为结构体名,如:struct student /*该类型共包含4个成员,各成员的类型可以不同*/{int num;char name[20];int age;float score;}; /*作为类型的定义,此行最后的“;”不可缺少*/ 2、再定义两个属于struct student类型的结构体变量stud1和stud2struct student stud1,stud2; /*其中“struct student”为结构体类型名*/ 这两个结构体变量stud1、stud2在内存中所占字节数均为28(=2+20+2+4)。
3、说明1)定义一个标准类型的变量时,只需指定类型名、变量名即可,如int i,j;2)而定义一个结构体变量时,不但要指定结构体类型,而且还必须指明是哪一种具体的结构体类型,如stud1,stud2;(student为具体的结构体名,而struct student整体则代表具体的结构体类型)。
共用体和结构体的区别
其中,struct 是结构体关键字,一定不能省略。 node 是结构体名,可以省略,成为无名结构体。 结构体成员可以使基本类型或者构造类型。 3、特点 变量用.访问,指针用 ->访问。eg. node.num = 1; node->ame = abc; 共用体 1、共用体的作用 用覆盖技术,几个变量相互覆盖,从而使几个不同变量共占一段内存 的结构。共用体的所有成员都在一段内存中存放,起始地址一样,并且同一 时刻只能使用其中的一个成员变量。
2、结构体总空间大小,等于各成员总长度,共用体空间等于最大成 员占据的空间。 3、共用体不能赋初值而结构体可以。
2、共用体的定义 共用体如下所示, 其中 union 是共用体关键字,不能省略。node 是共用体名。 3、特点 用体内存长度是内部最长的数据类型的长度。 共用体的地址和内部各成员变量的地址都是同一个地址 主要区别 1、结构体每一位成员都用来表示一种具体事务的属性,共用体成员 可以表示多种属性(同一存储空间可以存储不同类型的数据) 。
共用体和结构体的区别
在 c++中,结构体(struct)和共用体(union)是两种很相似的复合 数据类型,都可以用来存储多种数据类型,但是两者还有很大的区别。 结构体 1、结构体的作用 在网络协议、通信控制、嵌入式系统的 C/C++编程中,我们经常要传 送的不是简单的字节流,而是多种数据组合起来的一个整体,其表现形式就 是一个结构体。 2、结构体的定义 结构体:是指定义相应的数据结构及相应的变量。 结构体如下所示,
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
结构体与共用体小结一,结构体的概念和定义1,结构体的定义struct 结构体名{数据类型成员名1;数据类型成员名1;...};这里数据类型可以是复合类型,例如又是一个结构体类型,即嵌套;2,结构体变量的定义struct 结构体名变量名1,变量名2,,,变量名n;或:struct 结构体名{数据类型成员名1;数据类型成员名1;...}结构体变量1,结构体变量2;或:struct{数据类型成员名1;数据类型成员名1;...}结构体变量1,结构体变量2;三种方式,第三种方式的话,每次要定义这个类型的结构体变量都要重复的写这一段代码;其实定义了结构体后,struct 结构体名就是一种新的类型,上述语句就像声明变量一样;3,结构体变量的引用只能对结构体变量中的各个成员分别输出,不能对一个结构体变量作为一个整体输出;嵌套的结构体类型的引用:结构体变量名.结构体类型成员名.嵌结构体的成员名;4,结构体变量的初始化struct 结构体名变量名= {初始化数据};或者在定义的时候就初始化:struct 结构体名{数据类型成员名1;数据类型成员名1; ...}变量名= {初始化数据};二,结构体数组1,结构体数组的定义举例struct stu{int stu_nu;char name[20];float score;};struct stu student[5];或者:struct stu{int stu_nu;char name[20];float score;}student[5];或者:struct{int stu_nu;char name[20];float score;}student[5];跟定义结构体变量的三种形式是一样的,只不过这里每次定义的结构体变量是一个数组;每一个student[i]都是struct stu类型的;2,结构体数组的初始化和引用略;三,结构体与指针1,指向结构体的指针的定义,同上,也是三种形式;struct employees employee1,*p1;或者:struct employees...}employee1,*p1;或者:struct{...}employee1,*p1;然后可进行如下操作:p1 = &employee1;此时p1指向首地址;2,用结构体变量指针来引用结构体成员的两种操作:(*结构体变量的指针名).成员名;如:(*p1).name;括号不能省略,.的优先级是最高的;或:结构体变量的指针名->成员名;如:p1->name;注意.和->的优先级是最高的;;(*p1).name;p1->name;是等价的;3,结构体数组与指针struct stu{int stu_nu;char name[20];float score;}student[5],*p;此时可以(1)把数组student的起始地址赋给p:p = student;此时p指向student[0];(2)也可把student的其他元素的地址赋给pp = &student[3];(3)利用指针移动如p++使p指向结构体数组的不同元素;四,结构体作为函数参数1,结构体变量作为函数参数2,指向结构体变量的指针作为函数参数略,在后续文章里将给出一个例子;共用体的概念在C++语言中,不同数据类型的数据可以使用共同的存储区域,这种数据构造类型称为共用体,简称共用,又称联合体。
共用体在定义、说明和使用形式上与结构体相似。
两者本质上的不同仅在于使用存的方式上。
定义一个共用体类型的一般形式为:union 共用体名{成员表列;};例如:union gyt{int i;char c;float f;};就定义了一个共用体类型union gyt,它由三个成员组成,这三个成员在存中使用共同的存储空间。
由于共用体路各成员的数据长度往往不同,所以共用体变量在存储时总是按其成员中数据长度最大的成员占用存空间。
如:共用体类型union gyt的变量占用4个字节的存。
在这一点上共用体与结构体不同,结构体类型变量在存储时总是扫各成员的数据长度之和占用存空间。
如,定义了一个结构体类型:struct gyt{int i;float f;};则结构体类型struct gyt的变量占用的存为2+1+4个字节,也就是7个字节。
定义共用体变量的方法与定义结构体类型变量的方法相似,也有三种方法:union 共用体名{成员表列;}变量表列;如:union gyt{int i;char c;float f;}a,b,c;区分共用体类型定义与共用体变量定义union gyt{int i;char c;};union gyt a,b,c;直接定义共用体变量:union{int i;char c;float f;}a,bc;与结构体类似,也可以定义共用体指针和共用体数组。
union 共用体名*共用指针名;union 共用体名数组名[元素个数];例如:union gyt *pu;union gyt u1[3]; //分别定义了共用体指针pu和共用体数组u1[3]。
共用体变量的使用形式由于共用体变量的各个成员使用共同的存区域,所以共用体变量的存空间在某个时刻只能保持某个成员的数据。
由此可知,在程序中参加运算的必然是共用体变量的某个成员,而不能直接使用共用体变量。
共用体变量成员的表现形式与结构体相同,它们也使用访问成员运算符"."和"->"表示。
例如,前面定义了a,b,c为共用体类型变量,下面使用形式是正确的:a.i 引用共用体变量中的整型变量ia.c 引用共用体变量中的字符变量ca,f 引用共用体变量中的实型变量f不能只引用共用体类型变量,如:cout<<a是错误的,a的存储区域有好几种类型,分别占用不同长度的存储区,仅写共用体类型变量名a难以使系统确定究竟输出的是哪一个成员的值。
应该写成cout<<a.i或cout<<a.c等。
在使用共用体类型变量的数据时要注意:在共用体类型变量中起作用的成员是最后一次存放的成员,在存入一个新的成员后原胡的成员就失去了作用,如:a.i=1;a,c='a';a.f=1.3;在完成了三个赋值运算以后,只有a.f是有效的,其他的忆被覆盖了。
共用体类型变量可以向另一个相同共用体类型的变量赋值。
此外,共用类型变量可以作为参数传递给函数,也可以使用地址传递方式把共用体类型变量的地址作为参数在函数间传递。
在程序中经常使用结构体与共用体相互嵌套的形式。
即共用体类型的成员可是结构体类型,或结构体类型的成员是共用体类型。
例如,下列结构何体类型datas的第三个成员是共用体类型:struct datas{char *ps;int type;union{float fdata;int idata;char cdata;}udata;};结构体与共用体的大小A.结构体与共用体一、结构体(struct)1. 定义:结构体是由一系列具有相同数据类型或不同数据类型的数据构成的数据集合。
2.例子:struct student{int num;char name[20];};注意不要忽略最后的分号3.定义结构体类型变量的方法:strcut student student1, student2;4.大小:(1) 空结构体的大小为1byte.(2)结构体的大小要是最严格,看下面详细介绍。
如:struct student{int num;char name;};占据的存空间为8个byte。
struct student{int num;char name;char mark;};大小也是8个Byte。
按存对齐方式说,应该是12个字节,所以这里有些不明白。
注意:结构体变量可以有这样的赋值:A=B;二、共用体(union)1.定义:union维护足够的空间来放置多个数据成员中的“一种”,而不是为每一个数据成员配置空间,在union中所有的数据成员公用一个空间,同一时间只能存储其中的一个数据成员,所有的成员具有相同的起始地址。
举例:union data{int i;char ch;float f;}大小为4个字节。
2. 引用方式:不能引用共用体的变量,只能引用变量中的成员。
如a.i, a.ch.B.结构体的大小运算符sizeof可以计算出给定类型的大小,对于32位系统来说,sizeof(char) = 1; sizeof(int) = 4。
基本数据类型的大小很好计算,我们来看一下如何计算构造数据类型的大小。
C语言中的构造数据类型有三种:数组、结构体和共用体。
数组是相同类型的元素的集合,只要会计算单个元素的大小,整个数组所占空间等于基础元素大小乘上元素的个数。
结构体中的成员可以是不同的数据类型,成员按照定义时的顺序依次存储在连续的存空间。
和数组不一样的是,结构体的大小不是所有成员大小简单的相加,需要考虑到系统在存储结构体变量时的地址对齐问题。
看下面这样的一个结构体:struct stu1{int i;char c;int j;};类型对齐方式(变量存放的起始地址相对于结构的起始地址的偏移量)??Char 偏移量必须为sizeof(char)即1的倍数??Short 偏移量必须为sizeof(short)即2的倍数??int ?? 偏移量必须为sizeof(int)即4的倍数??float ?? 偏移量必须为sizeof(float)即4的倍数??double ? 偏移量必须为sizeof(double)即8的倍数实际上,由于存储变量时地址对齐的要求,编译器在编译程序时会遵循两条原则:一、结构体变量中成员的偏移量必须是成员大小的整数倍(0被认为是任何数的整数倍)二、结构体大小必须是所有成员大小的整数倍。
对照第一条,上面的例子中前两个成员的偏移量都满足要求,但第三个成员的偏移量为5,并不是自身(int)大小的整数倍。
编译器在处理时会在第二个成员后面补上3个空字节,使得第三个成员的偏移量变成8。
对照第二条,结构体大小等于最后一个成员的偏移量加上其大小,上面的例子中计算出来的大小为12,满足要求。
再看一个满足第一条,不满足第二条的情况struct stu2{int k;short t;};成员k的偏移量为0;成员t的偏移量为4,都不需要调整。
但计算出来的大小为6,显然不是成员k大小的整数倍。
因此,编译器会在成员t后面补上2个字节,使得结构体的大小变成8从而满足第二个要求。
由此可见,大家在定义结构体类型时需要考虑到字节对齐的情况,不同的顺序会影响到结构体的大小。
对比下面两种定义顺序struct stu3 struct stu4 { {char c1; charc1;int i;char c2;char c2; int i;}}虽然结构体stu3和stu4中成员都一样,但sizeof(struct stu3)的值为12而sizeof(struct stu4)的值为8。