自定义数据类型03

联合体

创建和声明联合体

联合体和结构体的区别:联合体的特性是共享内存,不像结构体中元素各自使用各自的内存空间,联合体是通过关键字union进行声明的,如下所示:

typedef union data{
	short i;
	char ch;
	float f;
}DATA;

计算字节大小

这里可以打印一下联合体所占的字节数,做一个观察,为什么说他是共享内存。这里它将打印所有属性中所占空间最大的属性字节数,因为它是共享内存,只要能存储的下最大的那一个即可,如果是结构体,这里得到的将是所有元素大小的总和。

printf("%d\n", sizeof(DATA a)); //结果为4,并非所有字节总数

遍历联合体

因为联合体拥有内存共享的特性,所以不能像结构体那样一次性为所有的元素赋值,然后再统一的打印出来,如果那样的话,因为他们共用同一处内存空间,所以会导致后面赋值的元素会覆盖先前赋值好的元素。所以想要遍历联合体中的每一个元素,我们可以给联合体中的每一个元素分别赋值,然后再分别打印出来。

#include<stdio.h>

typedef union data{
	short i;
	char ch;
	float f;
}DATA; 

int main()
{
	DATA temp2;
	temp2.i = 100;
	printf("%hd\n", temp2.i);
	temp2.ch = 'a';
	printf("%c\n", temp2.ch);
	temp2.f = 2.5;
	printf("%.1f\n", temp2.f);
//	printf("%hd, %c, %.1f\n", temp2.i, temp2.ch, temp2.f);
	return 0;
}

判断字节序

之前我们使用过指针判断过字节序,这里使用联合体也可以判断字节序,具体的思路就是,我们可以在联合体中定义一个int型变量和一个char型变量,然后先给联合体中的int型变量赋一个16进制的值,先占用联合体的内存,然后使用联合体中的char型变量去取值,如果取到的两位数字刚好是16进制数最低位开始两位的数字,那么这就是小端序,不然就是大端序。

使用联合体判断字节序的具体代码如下:

#include<stdio.h>
typedef union data{
	int i;
	char ch;
}DATA;

int main()
{
	DATA temp; 
	temp.i = 0x1234567;      //一个16进制数占4位,一个八进制数占3位,一个二进制占1位 
	if(temp.ch == 0x12)
	{
		printf("%x", temp.ch);
		printf("大端序\n");
	}
	else
	{
		printf("%x", temp.ch);
		printf("小端序\n");
	}
	return 0;
}

注:每位16进制数在内存中占4bit,所以两个16进制数占用一个字节,也就能被一个char型的变量读取。

枚举

声明

枚举一般用于将一些数字变成有意义的变量名称,用在程序中使得可读性更好,枚举使用关键字enum来定义。当给枚举结构中的一个元素赋值之后,后面的元素依次加一,当然也可以为每一个元素都赋值,但是不推荐这样做。

typedef enum week
{
	mon = 1, tus, wed, thu, fri, sat, sun
}WEEK;

注:给枚举结构中元素赋值只能在定义的时候赋值,在结构外面它被当做常量来对待,不能够再赋值。

使用

枚举类型的使用与结构体类型类似,在类型定义好自后,就可以直接使用了,它也能够使用typedef取一个别名。

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

typedef enum week
{
	mon = 1, tus, wed, thu, fri, sat, sun
}WEEK;

int main()
{
	enum week weekday;
	WEEK workday;
	workday = sun;
	weekday = mon;
	printf("%d\n", workday);
	printf("%d\n", weekday);
	weekday = wed;
	printf("%d\n", weekday);
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值