C语言自定义类型:联合和枚举

个人主页:C++忠实粉丝
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C++忠实粉丝 原创

C语言自定义类型:结构体

收录于专栏【C语言学习
本专栏旨在分享学习C语言学习的一点学习笔记,欢迎大家在评论区交流讨论💌

目录

1. 联合体 

1.1 联合体类型的声明

​1.2 联合体的特点

示例一:

示例二:

1.3 相同成员的结构体和联合体对⽐ 

1.4 联合体⼤⼩的计算 

1.5联合体的应用

练习:

 2. 枚举类型

2.1 枚举类型的声明

2.2 枚举类型的优点 

2.3 枚举类型的使⽤ 


1. 联合体 

1.1 联合体类型的声明

像结构体⼀样,联合体也是由⼀个或者多个成员构成,这些成员可以不同的类型。

但是编译器只为最⼤的成员分配⾜够的内存空间。联合体的特点是所有成员共⽤同⼀块内存空间。

所以联合体也叫:共⽤体。

给联合体其中⼀个成员赋值,其他成员的值也跟着变化。

联合体的类型说明:

union Un
{
	char c;
	int i;
};

输出联合体的内存大小:

int main()
{
	//联合变量的定义

	union Un un = { 0 };
	//计算⼤⼩

	printf("%d\n", sizeof(un));

	return 0;
}

输出结果:

 1.2 联合体的特点

 联合的成员是共⽤同⼀块内存空间的,这样⼀个联合变量的⼤⼩,⾄少是最⼤成员的⼤⼩(因为联合⾄少得有能⼒保存最⼤的那个成员)。

示例一:

 //代码1
#include <stdio.h>
//联合类型的声明

union Un
{
	char c;
	int i;
};
int main()
{
	//联合变量的定义

	union Un un = { 0 };
	//下⾯输出的结果是⼀样的吗?

	printf("%p\n", &(un.i));
	printf("%p\n", &(un.c));
	printf("%p\n", &un);
	return 0;
}

输出结果:

代码1输出的三个地址⼀模⼀样 

示例二:

//代码2
#include <stdio.h>
//联合类型的声明

union Un
{
	char c;
	int i;
};
int main()
{
	//联合变量的定义

	union Un un = { 0 };
	un.i = 0x11223344;
	un.c = 0x55;
	printf("%x\n", un.i);
	return 0;
}

输出结果:

 调式结果:

代码2的输出,我们发现将i的第4个字节的内容修改为55了。 我们仔细分析就可以画出,un的内存布局图。 

1.3 相同成员的结构体和联合体对⽐ 

我们再对⽐⼀下相同成员的结构体和联合体的内存布局情况。

如果大家对结构体的内存对齐还不是很了解的话,可以先去下面的博客,讲解的很清楚C语言自定义类型:结构体-CSDN博客 

1.4 联合体⼤⼩的计算 

• 联合的⼤⼩⾄少是最⼤成员的⼤⼩。

• 当最⼤成员⼤⼩不是最⼤对⻬数的整数倍的时候,就要对⻬到最⼤对⻬数的整数倍。

示例:

#include <stdio.h>
union Un1
{
	char c[5];
	int i;
};

union Un2
{
	short c[7];
	int i;
};

int main()
{
	//下⾯输出的结果是什么?

	printf("%d\n", sizeof(union Un1));
	printf("%d\n", sizeof(union Un2));
	return 0;
}

输出结果:

解析:

第一个联合体,char c[5]为5个字节,int i为4个字节,5不为不是最⼤对⻬数的整数倍,所以对齐到最⼤对⻬数的整数倍为8

第二个联合体short c[7]为14个字节,int i为4个字节,14不是最⼤对⻬数的整数倍,所以对齐到最⼤对⻬数的整数倍为16

1.5联合体的应用

 使⽤联合体是可以节省空间的,举例:

⽐如,我们要搞⼀个活动,要上线⼀个礼品兑换单,礼品兑换单中有三种商品:图书、杯⼦、衬衫。

每⼀种商品都有:库存量、价格、商品类型和商品类型相关的其他信息。

图书:书名、作者、⻚数

杯⼦:设计

衬衫:设计、可选颜⾊、可选尺⼨

那我们不耐⼼思考,直接写出⼀下结构:

struct gift_list
{
    //公共属性

        int stock_number;//库存量

        double price; //定价

        int item_type;//商品类型

        //特殊属性

        char title[20];//书名

        
        char author[20];//作者

        int num_pages;//⻚数


        char design[30];//设计

        int colors;//颜⾊

        int sizes;//尺⼨

};

上述的结构其实设计的很简单,⽤起来也⽅便,但是结构的设计中包含了所有礼品的各种属性,这样 使得结构体的⼤⼩就会偏⼤,⽐较浪费内存。因为对于礼品兑换单中的商品来说,只有部分属性信息是常⽤的。

⽐如: 商品是图书,就不需要design、colors、sizes。 所以我们就可以把公共属性单独写出来,剩余属于各种商品本⾝的属性使⽤联合体起来,这样就可以介绍所需的内存空间,⼀定程度上节省了内存。 

struct gift_list
{
    int stock_number;//库存量

    double price; //定价

    int item_type;//商品类型


    union {
        struct
        {
            char title[20];//书名

            char author[20];//作者

            int num_pages;//⻚数

        }book;

        struct
        {
            char design[30];//设计
        }mug;

        struct
        {
            char design[30];//设计

            int colors;//颜⾊

            int sizes;//尺⼨

        }shirt;
    }item;
};

练习:

写⼀个程序,判断当前机器是⼤端?还是⼩端?

判断大小端问题我们之前在数据在内存中的存储-CSDN博客中有详细讲解过,今天我们学完联合体,可以用一中很巧妙的方法判断是否为大小端.

int check_sys()
{
	union
	{
		int i;
		char c;
	}un;
	un.i = 1;

	return un.c;//返回1是⼩端,返回0是⼤端
}

int main()
{
	int i = check_sys();
	if (i == 1)
		printf("小端");
	else
		printf("大端");

	return 0;
}

输出结果:

 

 2. 枚举类型

2.1 枚举类型的声明

枚举顾名思义就是⼀⼀列举。

把可能的取值⼀⼀列举。

⽐如我们现实⽣活中:

⼀ 周的星期⼀到星期⽇是有限的7天,可以⼀⼀列举

性别有:男、⼥、保密,也可以⼀⼀列举

⽉份有12个⽉,也可以⼀⼀列举

三原⾊,也是可以列举

这些数据的表⽰就可以使⽤枚举了。

enum Day//星期
{
	Mon,
	Tues,
	Wed,
	Thur,
	Fri,
	Sat,
	Sun
};

enum Sex//性别
{
	MALE,
	FEMALE,
	SECRET
};


enum Color//颜色
{
	RED,
	GREEN,
	BLUE
};

以上定义的enum Day , enum Sex , enum Color 都是枚举类型。

{}中的内容是枚举类型的可能取值,也叫 枚举常量。

这些可能取值都是有值的,默认从0开始,依次递增1,当然在声明枚举类型的时候也可以赋初值。

比如:

enum Color
{
	//三原色的可能取值 - 枚举常量
	RED,
	GREEN=5,//
	BLUE//
};



int main()
{

	printf("%d\n", RED);
	printf("%d\n", GREEN);
	printf("%d\n", BLUE);


	return 0;
}

 输出结果:

enum Sex
{
	MALE,//0
	FEMALE,//1
	SECRET//2
};

int main()
{
	enum Sex s = MALE;

	return 0;
}

2.2 枚举类型的优点 

为什么使⽤枚举?

我们可以使⽤ #define 定义常量,为什么⾮要使⽤枚举?

枚举的优点:

1. 增加代码的可读性和可维护性

2. 和#define定义的标识符⽐较枚举有类型检查,更加严谨。

3. 便于调试,预处理阶段会删除 #define 定义的符号

4. 使⽤⽅便,⼀次可以定义多个常量

5. 枚举常量是遵循作⽤域规则的,枚举声明在函数内,只能在函数内使⽤

2.3 枚举类型的使⽤ 

enum Color//颜⾊
{
	RED = 1,
	GREEN = 2,
	BLUE = 4
};


enum Color clr = GREEN;//使⽤枚举常量给枚举变量赋值

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值