C语言——联合体/共用体

联合体和结构体类似但又不同,C语言中的联合体(Union)是一种特殊的数据类型,它允许在相同的内存位置存储不同的数据类型。联合体提供了一种方式,使得不同的数据类型可以共享同一段内存空间。但是,在任何给定的时刻,联合体只能存储它的成员之一的值;即联合体的所有成员从相同的内存地址开始。 

联合体的声明

联合体使用union关键字来声明,后跟联合体的名称和它的成员列表,成员列表用花括号{}括起来,成员之间用逗号,分隔。

union TestU{
	int    idata;
	char   cdata;
	double ddata;
};

在这个例子中,TestT是一个联合体,它可以存储一个int、一个char或者一个double变量。但是,在任何时候,它只能存储这三种类型之一的值。

联合体的大小

联合体的大小至少是足够存储它最大成员所需的空间。由于联合体的所有成员都从相同的内存地址开始,因此它的总大小不会是所有成员大小的总和,而是它最大成员的大小。

#include<stdio.h>

struct TestT{
	int    idata;
	char   cdata;
	double ddata;
};

union TestU{
	int    idata;
	char   cdata;
	double ddata;
};

int main()
{
	struct TestT t1;
	union  TestU u1;
	
	printf("结构体t1的大小是:%d\n",sizeof(t1));
	printf("联合体u1的大小是:%d\n",sizeof(u1));
	
	return 0;
}

输出将是:


                
### C语言中的结构体与共用体 #### 结构体的定义和使用 在C语言中,结构体是一种用户自定义的数据类型,允许存储不同类型的数据项。通过`struct`关键字来定义结构体,并指定其成员变量及其数据类型。 ```c struct Student { char name[50]; int roll; float marks; }; ``` 此段代码创建了一个名为 `Student` 的新复合型态[^1]。 #### 共用体的概念及声明方式 不同于结构体的是,共用体内所有成员共享同一块内存空间;这意味着在同一时间里只有一个成员能保存有效值。利用`union`关键字可以定义这样的联合体: ```c union Data { int i; float f; char str[20]; } data; ``` 上述例子展示了如何建立一个叫做 `Data` 的共用体型态并初始化它的一个实例 `data`[^2]。 #### 实际应用案例分析 考虑一段程序片段用于查找年龄最大的学生记录。这里展示了一种实现方法,其中涉及到了之前提到过的结构体概念的应用场景之一——数组作为函数参数传递给另一个处理逻辑更复杂的子过程来进行操作。 ```c #include <stdio.h> typedef struct { char name[10]; int age; } STD; STD find_oldest_student(STD std[], int n) { STD max = std[0]; for (int i = 1; i < n; ++i){ if (max.age < std[i].age) max = std[i]; } return max; } int main() { STD students[] = {{"aaa", 17}, {"bbb", 16}, {"ccc", 18}, {"ddd", 17}, {"eee", 15}}; size_t length = sizeof(students)/sizeof(*students); STD oldest = find_oldest_student(students, length); printf("Oldest student is named %s with an age of %d.\n", oldest.name, oldest.age); } ``` 这段代码实现了从一组学生活动记录中找出年纪最长者的信息打印功能[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hardStudy_h

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值