枚举、联合的讲解

枚举

枚举顾名思义就是一一列举。 把可能的取值一一列举。

枚举类型的定义

enum Day
{
	Mon, 
	Tues,
	Wed, 
	Thur, 
	Fri, 
	Sat, 
	Sun
};
enum Sex
{
	MALE, 
	FEMALE,
	SECRET
};

以上定义的enum Day,enum Sex都是枚举类型。
{}中的内容是枚举类型的可能取值,也叫枚举常量 。这些可能取值都是有值的,默认从0开始,依次递增1,当然在定义的时候也可以赋初值

例如

enum Sex
{
	MALE = 1, 
	FEMALE = 2,
	SECRET = 4
};

枚举的优点

为什么使用枚举?

我们可以用#define定义变量,为什么非要用枚举呢?枚举的优点:

  1. 增加代码的可读性和维护性
  2. 和#define定义的标识符比较枚举有类型检查,更加严谨。
  3. 防止命名污染
  4. 便于调试
  5. 使用方便,一次可以定义多个变量

枚举的使用

#include <stdio.h>
enum COLOR{red,green,blue};
int main()
{
    enum COLOR color;
    scanf("%d",&color);
    printf("%d",color);   //输入和输出仍然是整形数据,不能输入字符串。。。
    return 0;
}
#include <stdio.h>
enum COLOR{red,green,blue};
void fun(enum COLOR color)
{
    printf("%d",color);
}
int main()
{
    enum COLOR color=red;
    fun(color);
    return 0;
}

联合

联合类型的定义

联合也是一种特殊的自定义类型,这种类型定义的变量也包含一系列成员,特征是这些成员共用一块空间(所以叫联合共同体)
比如:

	union Un
	{
		char c;
		int i;
	};
	union Un un;
	printf("%d\n", sizeof(un));

联合的特点

联合成员是共用一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小

	union Un
	{
		char c;
		int i;
	};
	union Un un;
	//下面输出的结果是一样的吗?
	printf("%d\n", &(un.i));
	printf("%d\n", &(un.c));

	//下面输出的结果是什么?
	un.i = 0x11223344;
	un.c = 0x55;
	printf("%x\n", un.i);

在这里插入图片描述
经典面试题:

判断当前机器的大小端

#include<stdio.h>
#include<windows.h>
int check_system()
{
	union Un
	{
		int i;
		char c;
	};
	union Un un;
	un.i = 1;
	return un.c;
}
int main()
{
	int ret = check_system();
	if (ret == 1)
	{
		printf("是小端");
	}
	else
	{
		printf("是大端");
	}
	system("pause");
	return 0;
}

联合大小的计算

  • 联合的大小至少是最大成员的大小。
  • 当最大成员不是最大对齐数的整数倍时,就要对齐到对大对齐数的整数倍。

比如:

union Un1 
{
    char c[5];    
    int i; 
 }; 
 union Un2 
 {
     short c[7];   //两个字节
     int i; 
};
 //下面输出的结果是什么? 
 printf("%d\n", sizeof(union Un1)); 
 printf("%d\n", sizeof(union Un2));

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值