小甲鱼 P51 共用体

本文深入探讨了C语言中的共用体(联合体)概念,解析了共用体成员如何共享同一段内存地址,以及这如何影响数据的存储和访问。通过实例代码,展示了在共用体中同时初始化多个成员的限制,以及如何正确使用共用体来优化内存使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

小甲鱼 P51 共用体

 

共用体(联合体,联合类型)

定义方式:

 

 

共用体的所有成员共享同一个内存地址!!

不能同时打印共用体三者的值!!

#include <stdio.h>
#include <string.h>

//共用体,共用同一个内存地址 
union Test
{
	int i;
	double pi;
	char str[6];
};

int main(void)
{
	union Test test;
	
	test.i = 520;
	test.pi = 3.14;
	strcpy(test.str, "FishC");
	
	printf("add od test.i: %p\n", &test.i);
	printf("add od test.pi: %p\n", &test.pi);
	printf("add od test.str: %p\n", &test.str);
	
	//只有最后一个成员str的值打印才正确,因为3个成员都是引用同一个内存地址
	//对它们三个赋值,会导致互相的覆盖
	//第二个成员打印3.13,好像差不多正确,实际打印错误
	//double占8个字节,第三个char是占6个字符,所以并没有完全覆盖8个字节的double pi 
	printf("test.i: %d\n", test.i);
	printf("test.pi: %.2f\n", test.pi);
	printf("test.str: %s\n", test.str);
	
	return 0;
}

 

修改一下代码:

(每一刻只能使用其中一个成员,而不能同时使用它们 )

#include <stdio.h>
#include <string.h>

//共用体,共用同一个内存地址 
union Test
{
	int i;
	double pi;
	char str[10];
};

int main(void)
{
	union Test test;
	
	test.i = 520;
	test.pi = 3.14;
	strcpy(test.str, "FishC.com");
	
	printf("add od test.i: %p\n", &test.i);
	printf("add od test.pi: %p\n", &test.pi);
	printf("add od test.str: %p\n", &test.str);
	
	//只有最后一个成员str的值打印才正确,因为3个成员都是引用同一个内存地址
	//对它们三个赋值,会互相的覆盖
	//打印第一个和第二个成员会打印错误 
	//double占8个字节,第三个char是占10个字符,所以完全覆盖double pi 
	//每一刻只能使用其中一个成员,而不能同时使用它们 
	printf("test.i: %d\n", test.i);
	printf("test.pi: %.2f\n", test.pi);
	printf("test.str: %s\n", test.str);
	
	printf("size of test: %d\n", sizeof(test));
	
	return 0;
}

结果:

 

 

定义共用体类型变量

定义共用体跟定义结构体的语法相似,你可以先声明一个共用体类型,再定义共用体变量:

union date

{

int i;

char ch;

float f;

};

union data a, b, c; 

也可以在声明的同时定义共用体变量:

union date

{

int i;

char ch;

float f;

}a, b, c;

 

 

初始化共用体

共用体,同一时间只能存放一个成员值,所以不要试图同时初始化多个成员

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值