共用体(联合体)

        共用体        

        与构造体类似,也是一种构造类型的数据结构,在同一个存储空间存储不同数据的类型。

        共用体的特点是:所有成员共用内存空间,开辟单位以数据类型最长的为准,大小是容量最大的成员向上取基本单位的整数倍 。

        再看另外一个例子,共用体内定义了一个char变量,开辟了四个字节,还有一个int变量,查看空间大小输出的结果为4。这就验证了上面所说的开,辟单位以数据类型最长的为准,大小是容量最大的成员向上取基本单位的整数倍 。

         但是一旦将char类型变量开辟了四个以上的字节,开辟的空间就会发生变化,如下图:

        共用体变量中的成员的值是最后一次存放的成员确定的,在存入一个新的成员的值后原有的成员的值会被覆盖

         关于结构体和共用体的练习

#include <stdio.h>
#define SIZE 5
//1. 声明共用体 
typedef union{
	int s_class;
	char position[10];
}Utech;
//2.声明结构体 
typedef struct{
	int num;
	char name[20];
	char chsex;
	char chjob;
//联合体的定义很关键 
	Utech type;
}Person;

void input(Person *pin_arr, int n)
{
	int i;
	for(i=0;i<n;i++)
	{
		printf("依次输入num、name、sex、job、type,用空格分隔\n");
		scanf("%d %s %c %c",&((pin_arr+i)->num),(pin_arr+i)->name,\
			&((pin_arr+i)->chsex),&((pin_arr+i)->chjob));	
		
		if((pin_arr+i)->chjob=='s')
		{
			scanf("%d",&((pin_arr+i)->type.s_class));
			getchar();
		}
		else if((pin_arr+i)->chjob=='t')
		{
			scanf("%s",&((pin_arr+i)->type.position));
			getchar();
		}//以下可以扩充 ,本else仅供参考 
		else
		{
			printf("职业输入错误\n");
		}
	}
}
/*
功能:实现对结构体数组的数据打印输出 
参数:Person *pin_arr    接收结构体的首地址
      int n              数组大小
返回值:无 
*/ 
void print(Person *pout_arr, int n)
{
	int i;
	for(i=0;i<n;i++)
	{
		printf("num=%d-name=%s-sex=%c-job=%c-",(pout_arr+i)->num, \
			(*(pout_arr+i)).name,(*(pout_arr+i)).chsex,(*(pout_arr+i)).chjob);
		if((pout_arr+i)->chjob=='s')
		{
			printf("type=%d\n",(*(pout_arr+i)).type.s_class);
		} 
		else if((pout_arr+i)->chjob=='t')
		{
			printf("type=%s\n",(*(pout_arr+i)).type.position);
		}		
	}
}

int main()
{
	Person person[SIZE];
	input(person,SIZE);
	print(person,SIZE);
	return 0;
 } 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值