结构和联盟
结构和联合都是C语言中用户定义的数据类型,并且在概念上是相同的,但是,它们在某些方面仍然不同,例如内存分配给其成员的方式。它们的声明相似但功能不同。它们允许用户在单个名称下组合不同的数据类型。虽然在声明结构变量时为每个成员使用单独的内存位置,但union变量的不同成员共享相同的内存位置。让我们研究一下结构和联合之间的区别是细节。
什么是结构?
结构只是C中另一个用户定义的数据类型,它允许用户将不同类型的数据类型组合成一个内存块中的单个类型。结构可以包含彼此相关的简单和复杂数据类型,否则这些数据类型将没有意义。结构中的每个成员都有自己的内存位置,以便可以随时访问和检索它。
当许多数据需要分组时使用结构,例如存储关于书籍中的许多成员的信息的目录或存储关于单个联系人的所有信息的地址簿 - 名称,地址,联系号码等。每个成员的地址将按升序排列,这意味着每个成员的内存将以不同的偏移值开始。改变一个成员的价值不会对其他成员产生任何影响。
'struct'关键字用于在单个名称下定义不同数据类型的结构。例如,如果要创建员工数据库,则需要在单个实体下存储员工的姓名,年龄,电话和工资明细。这是由关键字'struct'完成的,然后告诉编译器已经声明了一个结构。
struct employee {
字符串名称;
字符串年龄;
串电话;
串薪;
} emp1,emp2;
这里,'employee'是结构的名称,两个变量'emp1'和'emp2'是由'employee'类型创建的。结束括号必须后跟分号(;)。
结构的成员可以通过两种类型的运算符访问:
- 会员运营商
- 结构指针运算符
什么是联盟?
它是C中使用的特殊数据类型,允许用户在同一内存位置存储不同类型的数据类型。 union与结构非常相似,可以通过将关键字'struct'替换为关键字'union'来定义。成员在联合中覆盖彼此的记忆,并且它足够大以适合其所有成员。
当变量与union相关联时,编译器通过考虑最大内存的大小来分配内存,因此union的大小等于最大数据成员的大小。可以使用许多成员定义联合,但在任何给定的时间实例中只有一个成员包含该值。
对于union的所有成员,地址都是相同的,这意味着每个成员都以相同的偏移值开始。改变一个成员的价值会影响其他成员的价值。当您希望存储多种数据类型之一时,可以使用联合。
工会员工{
char name [32];
年龄;
浮动工资;
};
这里关键字'union'定义了union,它与结构的声明非常相似。变量可以存储一个字符串值,即“雇员的名字”,一个整数值,即“雇员的年龄”,或者一个浮点数,表示“雇员的工资”。
结构与联盟的区别
1.关键字
关键字'struct'用于定义结构,而'union'关键字用于定义联合。
2.内存分配
为结构内的成员分配单独的内存空间,并且成员具有不共享内存的不同地址。另一方面,union为其所有成员共享相同的内存空间,因此分配了共享内存位置。
3.会员访问
联合会一次存储一个值,使其所有成员一次只能访问一个成员。虽然可以在结构中存储多个值,但可以随时访问和检索任何成员值。
4.尺寸
结构的大小等于所有成员大小的总和或更多,而union的大小等于最大大小成员的大小。
5.初始化
在结构中,可以一次初始化多个成员,而在联合中,只能使用其类型的值初始化第一个成员。
5.价值
结构可以存储所有成员的不同值,并且一个成员的值的更改不会对其他成员的值产生任何影响。联盟为其所有成员存储相同的值,而一个成员的值的更改将影响其他成员的值。
结构与联盟
结构体 | 联盟 |
Struct关键字用于定义结构。 | Union关键字用于定义联合。 |
成员不在结构中共享内存。 | 成员共享联合中的内存空间。 |
任何成员都可以在结构中随时检索。 | 在工会中一次只能访问一个成员。 |
可以一次初始化结构的几个成员。 | 只能初始化第一个成员。 |
结构的大小等于每个成员的大小的总和。 | 联合的大小等于最大成员的大小。 |
改变一个成员的价值不会影响另一个成员的价值。 | 一个成员的价值变化将影响其他成员价值。 |
为所有成员存储不同的值。 | 为所有成员存储相同的值。 |
摘要
- 结构和联合都是C中用户定义的数据类型,它们在功能上和概念上是相同的,但在某些方面却完全不同。
- 两者都包含不同数据类型的变量,但它们使用相同的语法来声明变量和访问成员。虽然结构由'struct'关键字定义,但union由关键字'union'定义。
- 每个成员在结构中获得单独的内存位置,而在联合中,总内存空间等于最大大小的成员。所有成员在联合中共享相同的内存空间。
- 可以在结构中访问任何序列中的任何成员,而在联合中,只能访问最近存储的值的该变量。