C语言自定义类型详解(保姆级教学)

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

目录

1.结构体

1.1结构体的介绍

1.2结构体的声明

1.3特殊声明(匿名结构体类型)

1.4结构体自引用

1.5结构体变量的定义和初始化

1.6结构体内存对齐

1.7修改默认对其数

2.位段

2.1什么是位段

2.2位段的内存分配

3.枚举

3.1枚举的定义

3.2枚举的优点

4.联合体(共用体)

4.1联合体类型的定义

4.2联合体的特点

 4.3联合体大小的计算


什么是自定义类型?

在C语言中,我们可以使用结构体(Struct),枚举(Enum),联合体(Union)来创建自定义的类型。

1.结构体

1.1结构体的介绍

结构体(Struct):结构体是一种用户定义的数据类型,用于将不同类型的数据组合在一起,形成一个新的复合类型。结构体由一组成员(member)组成,每个成员可以是不同的数据类型,如整型、字符型、浮点型、指针等。结构体的定义使用 struct 关键字,然后指定结构体的名称以及成员列表。

1.2结构体的声明

struct student
{
	char name[20];
	int age;
	char sex[5];
	char id[20]
};

在上述代码中,我们定义了一个名为student的结构体,包含了一个整形类型和三个字符类型的数组。

1.3特殊声明(匿名结构体类型)

struct
{
	int a;
	float b;
	float c;
}x;

在上述代码中,省略了结构体的标签——这就是匿名结构体类型。

1.4结构体自引用

我们可以在结构体中包含一个结构体,如果包含的这个结构体是该结构体本身的结构体指针即为结构体的自引用。

struct student
{
	int age;
	char name[20];
	struct student* s1;
};

1.5结构体变量的定义和初始化

struct student
{
	int age;
	char name[20];
}s1,s2;//在声明结构体类型时定义变量s1,s2

struct student s3;//定义结构体变量s3


struct point
{
	int x;
	int y;
}p1={1,1};//结构体嵌套初始化


struct point p2 = { 1,2 };//初始化

1.6结构体内存对齐

结构体内存对齐是用来计算结构体的大小的

如何计算?

首先得掌握结构体的对齐规则:
1. 第一个成员在与结构体变量偏移量为0的地址处。
2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。
VS中默认的值为8
Linux中没有默认对齐数,对齐数就是成员自身的大小
3. 结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。
4. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整
体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍

实例:

struct S1
{
	char c1;
	int i;
	char c2;
};
int main()
{
	printf("%d \n", sizeof(struct S1));
	return 0;
}

C语言自定义类型详解(保姆级教学),C language learning,c语言,开发语言

 C语言自定义类型详解(保姆级教学),C language learning,c语言,开发语言

为什么存在内存对齐?
大部分的参考资料都是如是说的:
1. 平台原因(移植原因):
不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特
定类型的数据,否则抛出硬件异常。
2. 性能原因:
数据结构(尤其是栈)应该尽可能地在自然边界上对齐。
原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访
问。

总体来说:
结构体的内存对齐是拿空间来换取时间的做法

1.7修改默认对其数

#pragma pack(1)//设置默认对齐数为1
struct S3
{
	double d;
	char c;
	int i;
};
struct S4
{
	char c1;
	struct S3 s3;
	double d;
};
#pragma pack ()//取消设置默认对齐数,还原为默认

2.位段

2.1什么是位段

位段(Bitfields)是C语言中一种用于定义结构体成员的技术,它允许我们对结构体中的数据进行位级别的控制。

位段的目的是在结构体成员中存储各个字段(或位)的数据,并利用较少的内存空间。通常,在处理一些较小范围的整数值时,使用完整的字节或更大的数据类型可能会浪费内存。

位段的声明和结构体是类似的,有两个不同:

1.位段的成员必须是 int、unsigned int 或signed int 。
2.位段的成员名后边有一个冒号和一个数字

比如:

struct student
{
	int _a : 2;
	int _b : 5;
	int _c : 10;
	int _d : 30;
};

student就是一个位段类型。那student的大小呢?

C语言自定义类型详解(保姆级教学),C language learning,c语言,开发语言

2.2位段的内存分配

1. 位段的成员可以是 int unsigned int signed int 或者是 char (属于整形家族)类型
2. 位段的空间上是按照需要以4个字节( int )或者1个字节( char )的方式来开辟的。
3. 位段涉及很多不确定因素,位段是不跨平台的,注重可移植的程序应该避免使用位段。

实例:

struct S
{
char a:3;
char b:4;
char c:5;
char d:4;
};
struct S s = {0};
s.a = 10;
s.b = 12;
s.c = 3;
s.d = 4;

C语言自定义类型详解(保姆级教学),C language learning,c语言,开发语言

3.枚举

3.1枚举的定义

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=1,
GREEN=2,
BLUE=4
};

3.2枚举的优点

为什么使用枚举?
我们可以使用 #define 定义常量,为什么非要使用枚举?
枚举的优点:
1. 增加代码的可读性和可维护性
2. 和#define定义的标识符比较枚举有类型检查,更加严谨。
3. 便于调试
4. 使用方便,一次可以定义多个常量

4.联合体(共用体)

联合体是一种特殊的数据类型,允许在相同的内存位置存储不同类型的数据。与结构体不同的是,联合体中的各个成员共享相同的内存空间。

4.1联合体类型的定义

//联合体类型的声明
union Un
{
	char c;
	int i;
};

int main()
{
	//联合体变量的定义
	union Un un;
	//计算联合体变量的大小
	printf("%d\n", sizeof(un));
	//打印结果为4
}

4.2联合体的特点

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

union Un

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

	un.i = 1;
	un.c = 2;
	printf("%d \n", un.i);
	return 0;
}

C语言自定义类型详解(保姆级教学),C language learning,c语言,开发语言

 实例:判断当前机器的大小端?

int Pd()
{
	union
	{
		int i;
		char c;
	}un = { .i = 1 };
	return un.c;
}
int main()

{
	int ret = Pd();
	if (ret == 1)
	{
		printf("小端\n");
	}
	else
	{
		printf("大端\n");
	}
	return 0;
}

C语言自定义类型详解(保姆级教学),C language learning,c语言,开发语言

 4.3联合体大小的计算

联合的大小至少是最大成员的大小。
当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。
文章来源地址https://www.toymoban.com/news/detail-566079.html

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

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

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

相关文章

  • 详解C语言自定义类型(结构体,枚举,联合)

    ❤️ 作者简介 :RO-BERRY 致力于C、C++、数据结构、TCP/IP、数据库等等一系列知识,对纯音乐有独特的喜爱 📗 日后方向 : 偏向于CPP开发以及大数据方向,如果你也感兴趣的话欢迎关注博主,期待更新 🎄结构体是一些值的集合,这些值称为成员变量。结构的每个成员可以是不

    2024年02月16日
    浏览(37)
  • C语言进阶,第4节-自定义类型详解(结构体

    1. 结构的声明 //描述一个学生 //匿名结构体类型 编译器会把上面两种声明当做完全不同的两个类型 2. 结构体自引用 //正确的自引用方式: 注意: 3. 结构体变量定义和初始化 //定义 //初始化 4. 结构体内存对齐 //结构体对齐规则 : //例 1 //例 2 //为什么存在内存对齐?( 结构体

    2024年02月16日
    浏览(38)
  • C语言——自定义类型详解[结构体][枚举][联合体]

    我打算把结构体、枚举、联合体的重点内容总结一下,方便后期复习的时候能够更快,更准确的去拾取遗忘的知识。也希望能给大家起到借鉴的作用,不足的地方,请多多包涵。(不足的地方,也希望大家能够指出来) 结构体是一些值的集合,这些集合称为成员变量,结构体

    2024年02月13日
    浏览(41)
  • 【Go 基础篇】Go语言结构体详解:打开自定义类型的大门

    嗨,Go语言学习者们!在编程的世界里,数据是核心,而结构体(Struct)是一种能够帮助我们更有组织地存储和操作数据的重要工具。在本篇博客中,我们将深入探讨Go语言中结构体的概念、定义、初始化、嵌套、方法以及与面向对象编程的关系,带你逐步领略结构体的魅力。

    2024年02月10日
    浏览(45)
  • 【C语言】简单贪吃蛇实现保姆级教学!!!

    关注小庄 顿顿解馋૮(˶ᵔ ᵕ ᵔ˶)ა 新年快乐呀小伙伴 引言: 小伙伴们应该都有一个做游戏的梦吧?今天让小庄来用C语言简单实现一下我们的童年邪典贪吃蛇,顺便巩固我们的C语言知识,请安心食用~ 如下是我们将实现的效果 请看vcr 平时我们运行程序弹出的黑框框就是控

    2024年02月19日
    浏览(28)
  • 保姆级教学 - C语言 之 动态内存管理

      🌈 个人主页:白子寰 🔥 分类专栏: 魔法指针,进阶C++,C语言,C语言题集,C语言实现游戏 👈 希望得到您的订阅和支持~ 💡 坚持创作博文(平均质量分79.9+),分享更多关于深度学习、C/C++领域的优质内容!(希望得到您的关注~)  目录 为什么会有动态内存的分配  mal

    2024年04月09日
    浏览(35)
  • C/C++之分文件写静态通讯录详解(保姆级教学)

    个人主页:点我进入主页 专栏分类:C语言初阶      C语言程序设计————KTV       C语言小游戏     C语言进阶 C语言刷题 欢迎大家点赞,评论,收藏。 一起努力,一起奔赴大厂。 目录 1. 前言 2.主函数 3.增加函数   4.位置查找函数 5.删除函数  6.查找函数  7. 修改函数

    2024年02月07日
    浏览(33)
  • Hive——DDL(Data Definition Language)数据定义语句用法详解

    IF NOT EXISTS :可选参数, 表示如果数据库已经存在,则不会创建,避免出现重复创建的情况。 COMMENT :可选参数, 用于添加数据库的注释 。 LOCATION :可选参数, 指定数据库的存储路径 WITH DBPROPERTIES :可选参数, 用于设置数据库的额外属性 。 示例: 创建一个名为\\\"mydataba

    2024年04月27日
    浏览(45)
  • 【大数据之Hive】九、Hive之DDL(Data Definition Language)数据定义语言

    [ ] 里的都是可选的操作。 语法: 如: 如果不指定路径则默认路径为:${hive.metastore.warehouse.dir}/database_name.db (1)查看数据库 语法: 模糊匹配:like通配表达式说明:*表示任意个任意字符,|表示或的关系。 如: (2)查看数据库信息 语法: [extended]:是否要展示更详细信息

    2024年02月12日
    浏览(39)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包