C语言自定义类型(下)

这篇具有很好参考价值的文章主要介绍了C语言自定义类型(下)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

大家好,我们今天来学习C语言自定义类型剩下的内容。
C语言自定义类型(下),C语言,c语言,java,服务器

目录

1.枚举
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 都是枚举类型。
{}中的内容是枚举类型的可能取值,也叫 枚举常量 。

那么我们的枚举常量的值又是多少呢?

enum Sex
{
	//枚举的可能取值
	MALE,//枚举常量
	FEMALE,
	SECRET
};
enum Color
{
	RED,
	GREEN,
	BLUE
};

int main()
{

	printf("%d\n", MALE);
	printf("%d\n", FEMALE);
	printf("%d\n", SECRET);
	enum Sex sex = SECRET;

	printf("%zd\n", sizeof(sex));

	return 0;
}

C语言自定义类型(下),C语言,c语言,java,服务器

这是因为这些可能取值都是有值的,默认从0开始,一次递增1,当然在定义的时候也可以赋初值。

例如:

enum Sex
{
	//枚举的可能取值
	MALE=3,//枚举常量
	FEMALE,
	SECRET
};
int main()
{
	//MALE = 5;//ERR
	printf("%d\n", MALE);
	printf("%d\n", FEMALE);
	printf("%d\n", SECRET);
	enum Sex sex = SECRET;

	printf("%zd\n", sizeof(sex));

	return 0;
}

C语言自定义类型(下),C语言,c语言,java,服务器

这里我们给它赋初值,我们给MALE赋值为3,后面的值就会默认加1,所以打印的结果就为3,4,5。

我们不仅可以这么定义,而且我们可以用宏来进行赋值定义:

#define MALE 3
#define FEMALE 4
#define SECRET 5

那么我们最好还是用枚举,那这是为什么呢,只就得提到我们枚举的优点了:

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

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

当我们使用枚举时只能拿枚举常量给枚举变量赋值,才不会出现类型的差异。
例如下面的代码:

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

相信大家应该都已经了解了枚举的应用,那么我们就进入下个内容的学习。

2.联合(共用体)

联合类型的定义:

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

//联合类型的声明
union Un
{
	char c;
	int i;
};
//联合变量的定义
int main()
{
	union Un un;
	//计算连个变量的大小
	printf("%d\n", sizeof(un));
	return 0;
}

C语言自定义类型(下),C语言,c语言,java,服务器

union Un
{
	char c;//1
	int i;//4
};

int main()
{
	union Un un;
	//printf("%d\n", sizeof(un));
	printf("%p\n", &un);
	printf("%p\n", &(un.c));
	printf("%p\n", &(un.i));

	return 0;
}

C语言自定义类型(下),C语言,c语言,java,服务器

我们发现整个联合体的大小是4个字节,而我们定义的int型变量i就是4个字节,那么我们是不是就可以间接的认为联合体是公用一个空间一个内存的呢?我们再看到我们对整个联合体变量取地址和分别对联合体的成员变量取地址,打印出来发现它们的地址是一样的,这就可以说明联合体是公用一段内存的。

联合的特点

联合的成员是共用同一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小(因为联合至少得有能力保存最大的那个成员)。

还记得之前我们如何判断大端还是小端的题吗?这里我们就可以利用联合体来解决:

int check_sys()
{
	int a = 1;
	if (*(char*)&a == 1)//int*
		return 1;
	else
		return 0;
}

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

	return 0;
}

C语言自定义类型(下),C语言,c语言,java,服务器

C语言自定义类型(下),C语言,c语言,java,服务器

我们的小端是从低地址到高地址的,所以我们给a取出一个字节就是先给它强制转换为char型在解引用,如果等于1那么就是小端,如果不是1那就是大端。

联合大小的计算

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

union Un
{
	char c[5];//5
	int i;//4
};

int main() 
{
	printf("%zd\n", sizeof(union Un));

	return 0;
}

C语言自定义类型(下),C语言,c语言,java,服务器

union Un
{
	short c[7];//14
	int i;//4
};

int main()
{
	printf("%zd\n", sizeof(union Un));

	return 0;
}

C语言自定义类型(下),C语言,c语言,java,服务器

我们看到第一个代码因为char型的大小是一个字节,和vs默认的8个对齐数相比更小,所以它的对齐数是1,而int型的大小是4个字节,和vs默认的8个对齐数相比也小,所以它的对齐数就是4,而c是个字符类型的数组,占了5个字节,i只占了4个字节,因为联合的大小至少是最大成员的大小。当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。所以我们联合体的大小就是8个字节。而第二个代码也是这么计算,得出来的就是16个字节。

好了今天的学习就到这里了,感谢大家的支持,我们下次再见。文章来源地址https://www.toymoban.com/news/detail-721437.html

到了这里,关于C语言自定义类型(下)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • linux 服务器类型Apache配置https访问

    一:查看服务器类型,下载相应的SSL证书 命令:netstat -anp | grep :80 httpd 是Apache超文本传输协议(HTTP)服务器的主程序,所以下载Apache证书 二:将证书解压后复制到服务器上 三个文件:xxx.key xxx_public.cert xxx_chain.cert 三:准备工作完成,配置 1.命令: yum -y install mod_ssl   安装 m

    2024年02月21日
    浏览(47)
  • 腾讯云轻量服务器“镜像类型”以及“镜像”选择方法

    腾讯云轻量应用服务器镜像类型分为应用镜像、系统镜像、Docker基础镜像、自定义镜像和共享镜像,腾讯云百科txybk.com来详细说下不同镜像类型说明和详细介绍: 腾讯云轻量应用服务器 应用镜像:独有的应用镜像除了包含底层的操作系统外,还封装了应用软件(如LAMP、Wor

    2024年02月07日
    浏览(46)
  • 腾讯云轻量应用服务器“镜像”选择和“镜像类型”说明

    腾讯云轻量应用服务器镜像是什么?镜像就是操作系统,轻量服务器镜像系统怎么选择?如果是用来搭建网站腾讯云百科txybk.com建议选择选择宝塔Linux面板腾讯云专享版,镜像系统根据实际使用来选择,腾讯云百科来详细说下腾讯云轻量应用服务器镜像的选择方法: 轻量应用

    2024年02月06日
    浏览(60)
  • 服务器渲染+自定义模块+mysql操作

    A.第一步,导入模块库和第三方库 npm init npm --registry https://registry.npmmirror.com install art-template moment B.第二步,调整html文件 调整js文件 效果图: 通过前面几个章节的学习,我们基本掌握了NodeJS编程的基础知识,但是我们也直观的发现了一个问题,和我们之前学习浏览器编程时

    2024年01月25日
    浏览(52)
  • 华为云GPU服务器使用PaddleClas和PaddleServing训练、部署车辆类型分类模型服务

    以下针对最近使用PaddleClas和PaddleServing在华为云GPU服务器上训练和部署一个车辆类型识别模型过程进行记录,以供日后自己参考和其他有需要的朋友一些帮助,接触这方面东西时间较短,如有问题欢迎批评指正。 如何在华为云服务器上搭建GPU版本的PaddlePaddle环境请参考以下文

    2024年02月13日
    浏览(42)
  • Spring Security 自定义授权服务器实践

    相关文章: OAuth2的定义和运行流程 Spring Security OAuth实现Gitee快捷登录 Spring Security OAuth实现GitHub快捷登录 Spring Security的过滤器链机制 Spring Security OAuth Client配置加载源码分析 Spring Security内置过滤器详解 为什么加载了两个OAuth2AuthorizationRequestRedirectFilter分析 在之前我们已经对接

    2024年02月02日
    浏览(53)
  • Spring Security 自定义资源服务器实践

    相关文章: OAuth2的定义和运行流程 Spring Security OAuth实现Gitee快捷登录 Spring Security OAuth实现GitHub快捷登录 Spring Security的过滤器链机制 Spring Security OAuth Client配置加载源码分析 Spring Security内置过滤器详解 为什么加载了两个OAuth2AuthorizationRequestRedirectFilter分析 Spring Security 自定义授

    2024年01月22日
    浏览(40)
  • 阿里云服务器的存储容量和性能如何?是否支持多种存储类型?

     阿里云服务器的存储容量和性能如何?是否支持多种存储类型? 本文由阿里云代理商[聚搜云]撰写 阿里云服务器作为业界领先的云计算服务提供商,其存储容量和性能一直受到广泛关注。本文将为您介绍阿里云服务器的存储容量、性能以及支持的多种存储类型。  阿里云服

    2024年02月10日
    浏览(60)
  • 探索AWSLambda与MicrosoftAzurePowerApps:集成和自定义服务器less服务

    作者:禅与计算机程序设计艺术 随着云计算技术的不断发展,服务器less计算作为一种新兴的云计算服务,逐渐成为人们关注的热点。在云计算的世界里,AWS Lambda 和 Microsoft Azure Power Apps 是两种非常具有优势的服务,本文旨在探讨如何将它们集成起来,实现服务器less服务的自

    2024年02月07日
    浏览(59)
  • 从0开始学云计算之服务器:服务的定义,特点,应用场景,分类

    服务器定义 服务器是计算机的一种。它比普通计算机运行速度更快、负载更高且价格更高。 服务器的英文名称为“Server”,是指在网络上提供各种服务的高性能计算机。作为网络的节点,存储、处理网络上80%的数据、信息,因此也被称为x络的灵魂。 服务器的主要特点包括

    2024年02月08日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包