初识C语言·自定义类型(1)

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

目录

1 联合体类型的声明

2 联合体的特点

3 联合体的大小计算

4 枚举类型类型的声明

5 枚举的优点


1 联合体类型的声明

联合体,顾名思义,是多个对象连在一起的,即联合体的成员都是共用空间的,所以联合体也叫做共用体,既然是共用一块空间,那么改变其中一个成员的值的时候,其他对象的值也会随着改变。

联合体用到的关键字是union。

先介绍第一个特性,共用一块空间,

union un
{
	char a;
	int b;
};
int main()
{
	union un tem;
	printf("%zd\n", sizeof(tem));
	return 0;
}

联合体里面有一个字符类型,一个整型,整型占4个字节,字符占1个字节,所以会占4个字节。

初识C语言·自定义类型(1),c语言,开发语言

即编译器只会给占内存最大的成员分配空间。

介绍第二种特性,共用一块空间。

union un
{
	char a;
	int b;
};
int main()
{
	union un tem;
	printf("%zd\n", sizeof(tem));
	tem.b = 0x11223344;
	printf("%x %x", tem.a, tem.b);
	return 0;
}

因为vs是小端存储,所以存的16进制的11223344,所以存的顺序是44332211,那么a的值就是44,b的值就是11223344。

初识C语言·自定义类型(1),c语言,开发语言

前面提到的可以用联合体判断机器是大端机器还是小端机器,就是完美利用了联合体的特点,

union un
{
	char a;
	int b;
};
int main()
{
	union un tem;
	tem.b = 0x11223344;
	if (tem.a == 11)
	{
		printf("大端");
	}
	else
	{
		printf("小端");
	}
	return 0;
}

初识C语言·自定义类型(1),c语言,开发语言

在写联合体的时候,需要注意花括号后面要有分号,定义联合体变量的时候,是需要写union un的,当然,可以直接在花括号后面写,那种写法是表示定义,如下:
 

union un
{
	char a;
	int b;
}tem1,tem2;

2 联合体的特点

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

先看一段代码

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;
}

问打印的结果都是一样的吗?

初识C语言·自定义类型(1),c语言,开发语言

没错是的,这就是说明联合体的存放元素的时候都是从同一块空间开始存的。

因为空间共用,所以我们要修改前文的11223344中的44也是可以的,这里请自行实验咯。

这里稍微引入一点结构体的知识,我们比较一下在相同的成员情况下,结构体和联合体占用的内存多少。

union Un
{
	int a;
	char c;
	int i;
}un;
struct St
{
	int a;
	char c;
	int i;
}st;
int main()
{
	printf("%zd\n", sizeof(un));
	printf("%zd\n", sizeof(st));
	return 0;
}

可以看到,成员有两个char,一个int类型的,所以联合体的大小应该是4,那么结构体的大小是?

初识C语言·自定义类型(1),c语言,开发语言

是12?!对,确实是12,至于为什么,就下一篇再介绍了,这里涉及到的知识是内存对齐。


3 联合体的大小计算

联合体的大小就一定是最大成员的大小吗?举个例子。

union Un1 
{
	char c[5];
	int i;
};
union Un2
{
	short c[7];
	int i;
};
int main()
{
	printf("%zd\n", sizeof(union Un1));
	printf("%zd\n", sizeof(union Un2));
	return 0;
}

按刚才的来讲,Un1的大小应该是5,Un2的大小应该是14,让我们来揭晓谜底。

初识C语言·自定义类型(1),c语言,开发语言

结果是8 16,这是因为最大成员的大小不是最大对齐数的整数倍的时候,系统就会浪费空间去凑到最大对齐数的整数倍,且听下回分解。


4 枚举类型类型的声明

现实生活中比如星期1到星期7,性别,三原色,我们都是可以一一列举的,这就是枚举,将有限个数的元素一一列举出来。

枚举用到的关键字是enum,里面的成员叫做枚举常量,如下:

enum Color
{
	Red,
	Blue,
	yellow
};

注意格式,枚举变量中间是用逗号进行隔开的,且最后是没有分号的,但是花括号的后面依旧是有分号的。

这是枚举的声明,那枚举常量有没有值呢?

初识C语言·自定义类型(1),c语言,开发语言

答案是有的,并且看来是层层递增的,那么我们如果附上初值呢?

enum Color
{
	Red = 1,
	Blue = 3,
	yellow
};
int main()
{
	printf("%d ", Red);
	printf("%d ", Blue);
	printf("%d ", yellow);
	return 0;
}

初识C语言·自定义类型(1),c语言,开发语言

所以可以得出结论,枚举常量的值是递增的,修改之后也是递增的,且默认从0开始递增。

既然枚举常量是整型,是常量,我们可以应用到switch语句里面吗?

enum Color
{
	Red,
	Blue,
	yellow
};
int main()
{
	switch (Blue)
	{
	case 0:
		printf("0");
		break;
	case 1:
		printf("1");
		break;
	case 2:
		printf("2");
		break;
	default:
		break;
	}
	return 0;
}

当然是可以的,最后的结果就是1。

枚举常量也是可以用于给枚举常量赋值的。

enum Color clr = Blue;

像这样,但是在C语言里面是可以用整数给枚举常量赋值的,c++里面是不可以的,因为c++的类型检查比较严格,会认为这是两种不同的类型不能进行赋值。


5 枚举的优点

枚举的优点(和define相比):

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

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

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

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

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


感谢阅读!文章来源地址https://www.toymoban.com/news/detail-814752.html

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

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

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

相关文章

  • C语言自定义类型(下)

    大家好,我们今天来学习C语言自定义类型剩下的内容。 1.枚举 2.联合 枚举顾名思义就是一一列举。 把可能的取值一一列举。 一周的星期一到星期日是有限的7天,可以一一列举。 性别有:男、女、保密,也可以一一列举。 月份有12个月,也可以一一列举 枚举类型的定义 直

    2024年02月08日
    浏览(30)
  • c语言->自定义类型联合体和枚举类型

    文章目录 ✅作者简介:大家好,我是橘橙黄又青,一个想要与大家共同进步的男人😉😉 🍎个人主页:橘橙黄又青_C语言,函数,指针-CSDN博客 目的:学习联合体和枚举类型的声明联合体的特点和大小,枚举类型的有点和使用。 像结构体⼀样,联合体也是由⼀个或者多个成员构

    2024年02月05日
    浏览(25)
  • C语言_自定义类型详解

    提示:这里可以添加本文要记录的大概内容: 结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量 数组:一组相同类型的集合。 在声明结构的时候,可以不完全的声明。 上面的两个结构体在声明的时候省略掉了结构体标签(tag) 那么在上面代

    2024年02月06日
    浏览(31)
  • 【C语言】自定义类型的详细讲解2(枚举类型、联合体类型)

    目录 1.枚举 1.1枚举优点 2.联合(共用体) 2.1联合体的应用 2.2联合体的存放 上一篇文章与大家分享并深度讨论研究了自定义类型中结构体和位段的内容,那么今天继续研究枚举和联合体的内容,希望对你有所帮助 枚举类型顾名思义就是一一列举。 把可能的取值一一列举出来

    2023年04月18日
    浏览(32)
  • 自定义类型——结构体(C语言进阶)

    目录 一、结构的声明 1.1 一般声明 1.2 特殊声明 1.3 结构体自引用 二、结构体变量的定义和初始化  2.1 结构体变量的定义 2.2 结构体变量的初始化 三、结构体内存对齐 3.1 代码分析 3.2 结构体内存对齐的规则  3.3 嵌套结构体的大小 3.4 存在结构体内存对齐的原因 3.5修改默认对

    2024年02月16日
    浏览(28)
  • C语言:自定义类型——联合和枚举

    像结构体⼀样,联合体也是由⼀个或者多个成员构成,这些成员可以是不同的类型。 声明方式如下图: 那联合体和结构体究竟有什么区别呢?? 下面将重点讲解联合体的特点!! 1.2.1 特点1 所有成员共⽤同⼀块内存空间。所以联合体也叫: 共⽤体 。 我们可以发现,三个地

    2024年01月16日
    浏览(50)
  • 【C语言进阶:自定义类型详解】枚举

    本节重点内容: 枚举类型的定义 枚举的优点 枚举的使用 枚举:将可能的取值一一列举。 比如:一周的天数、性别、一年的月份等等可以使用枚举来将其可能出现情况列举出来。 枚举类型的基本使用: 运行结果如下:  当然,我们也可以将这些枚举常量在定义时附上初始值

    2023年04月08日
    浏览(29)
  • C语言进阶——自定义类型:枚举、联合

    🌇个人主页:_麦麦_ 📚今日名言:如果不去遍历世界,我们就不知道什么是我们精神和情感的寄托,但我们一旦遍历了世界,却发现我们再也无法回到那美好的地方去了。当我们开始寻求,我们就已经失去,而我们不开始寻求,我们根本无法知道自己身边的一切是如此可贵

    2024年01月21日
    浏览(33)
  • C语言自定义数据类型(一)定义和使用结构体变量

    C 语言提供了一些由系统已定义好的数据类型,如:int,float,char  等,用户可以在程序中用它们定义变量,解决一般的问题。 但是人们要处理的问题往往比较复杂,只有系统提供的类型还不能满足应用的要求,C语言允许用户根据需要自己建立一些数据类型,并用它来定义变

    2024年02月02日
    浏览(36)
  • 【C语言】结构体类型的定义与使用

    目录 一、结构体 二、结构体的定义 1.最基本的定义 2.有 typedef 的定义 3.定义即对象方式 4.定义即对象指针方式(涉及指针就会稍微复杂一点) 5. typedef结构体和结构体指针方式 三、结构体的使用         结构体是用户自定义的一种类型,这种类型里面可以声明不同的数据类

    2024年02月12日
    浏览(34)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包