【C语言进阶】第四节:自定义类型详解

1、结构体

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

struct Point//类型声明
{int x;int y;
}p1;//声明类型的同时定义变量p1struct Point p2;//定义结构体变量p2//初始化:定义变量的同时赋初值。
struct Point p3 = { x, y };struct Node
{int data;struct Point p;struct Node* next;
}n1 = { 10, {4,5}, NULL };//结构体嵌套初始化

1.2 结构体内存对齐

看两个练习:

//练习1
struct S1
{double d;char c;int i;
};
printf("%d\n", sizeof(struct S1));//练习2
struct S2
{char c1;struct S3 s3;double d;
};
printf("%d\n", sizeof(struct S2));

结构体的对齐规则:

  1. 第一个成员在与结构体变量偏移量为0的地址处。
  2. 其他成员变量要对齐到对齐数的整数倍的地址处。(对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值,vs中默认的值为8
  3. 结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。
  4. 如果嵌套了结构体,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

所以输出结果为:16 32

2、位段

2.1 什么是位段

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

  1. 位段的成员必须是 int、unsigned int 或signed int
  2. 位段的成员名后边有一个冒号和一个数字
struct A
{int _a : 2;int _b : 5;int _c : 10;int _d : 30;
};

A就是一个位段类型。

那位段A的大小是多少?答案:8

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;

3、枚举

3.1 枚举类型的定义

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

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

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

3.2 枚举的使用

enum Color//颜色
{RED=1,GREEN=2,BLUE=4
};
enum Color clr = GREEN;//只能拿枚举常量给枚举变量赋值,才不会出现类型的差异

4、联合(共用体)

4.1 联合类型的定义

联合是一种特殊的自定义类型

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

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

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

输出结果为4

4.2 联合的特点

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

一样的 11223355

练习:判断当前计算机的大小端存储

int check_sys()
{union{int i;char c;}un = {.i = 1};return un.c;
}int main()
{int ret = check_sys();if (ret == 1)printf("小端\n");elseprintf("大端\n");return 0;
}

4.3 联合大小的计算

  1. 联合的大小至少是最大成员的大小。
  2. 当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。
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));

Un1和Un2的最大对齐数都是4字节

8 16

练习:

union Un
{short s[7];int n;
};
int main()
{printf("%d\n", sizeof(union Un));return 0;
}

注意结果不是14而是16,因为最后要对齐到最大对齐数的整数倍处。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/148581.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

端侧 AI 的新突破:面壁智能 MiniCPM 3.0

在人工智能领域,每一次技术的革新都可能引发一场小小的革命。 ChatGPT-3.5 曾经凭借其惊人的表现赢得了大众的关注,但如今,随着国内AI公司面壁智能推出的新端侧基座模型,人们开始重新审视端侧AI的潜力和未来。 这款名为MiniCPM …

Dockerfile全面指南:从基础到进阶,掌握容器化构建的核心工具

目录 Dockerfile全面指南:从基础到进阶,掌握容器化构建的核心工具 引言 一、什么是 Dockerfile 二、Dockerfile 的基本结构 三、Dockerfile 的常见配置项 1、多阶段构建 (Multi-stage Builds) 2、缓存优化 3、合并 RUN 命令 四、Dockerfile 使用…

C盘太臃肿了用这招一键给C盘瘦身 快速释放C盘空间

C盘太臃肿了用这招一键给C盘瘦身 快速释放C盘空间。我们的电脑不知不觉的就爆满了,这个主要的原因就是各种垃圾文件堆积,时间用得越久,垃圾堆积得越多,这样我们的C盘空间就被蚕食了,空间越来越小,变得越来越…

干货分享:为什么stable diffusion训练用ddpm, 采样用ddim呢?

前言 回忆一下DDPM,实质上它的推导过程应是如下的: 其中, 是单纯的高斯分布的推导,相当于一个序列过程的归纳法推导。 在DDPM中采用的是[贝叶斯公式]。 而过程则是用对进行一个估测,也就是用前向过程反过来对进行一个…

sql语法学习:关键点和详细解释

学习SQL语法是掌握数据库操作的基础。以下是SQL语法的一些关键点和详细解释: 1. SQL基础 SQL(Structured Query Language)是一种用于管理和操作关系型数据库的标准语言。它主要包括以下几个部分: 数据定义语言(DDL&…

探索Mem0:AI的智能记忆层

文章目录 探索Mem0:AI的智能记忆层背景介绍Mem0是什么?如何安装Mem0?简单使用方法应用场景常见问题及解决方案总结 ![ 探索Mem0:AI的智能记忆层 背景介绍 在人工智能的世界里,记忆是个性化体验的关键。想象一下&…

结构设计模式 -装饰器设计模式 - JAVA

装饰器设计模式 前言 这是我在这个网站整理的笔记,有错误的地方请指出,关注我,接下来还会持续更新。 作者:神的孩子都在歌唱 一. 介绍 百度百科:装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对…

只需5分钟!掌握学术写作的核心逻辑!

人工智能的广泛应用中,ChatGPT 已被证明是一种极具潜力的语言模型,其功能涵盖多个领域,显示出强大的适应性。在 GPT-4 架构的推动下,ChatGPT 正在彻底改变我们与文本驱动的人工智能的交互模式。 在学术界,学术写作至关…

【测试】——Selenium API (万字详解)

📖 前言:本文详细介绍了如何利用Selenium进行Web自动化测试,包括定位元素(如cssSelector和xpath)、常用操作函数(如点击、输入等)、窗口管理、键盘鼠标事件和浏览器导航,以及处理弹窗…

实用小工具——多标签页插件Office Tab介绍

Office Tab引入选项卡式用户界面,增强了Microsoft Office使用体验。软件界面,可以设置你喜欢的标签类型。 安装后office界面会新增一个办公标签栏,立面有各功能说明。 最常用的是这个标签切换功能。 安装也很简单,选择对应位数安装…

知识产权实缴出资是否合法

知识产权实缴出资是否合法 近年来,随着知识产权在企业价值中的重要性日益凸显,知识产权实缴出资作为一种新兴的出资方式,逐渐受到社会各界的关注。然而,关于知识产权实缴出资是否合法的问题,一直是企业和投资者关注的焦…

vulnhub(13):LordOfTheRoot(sql时间盲注、mysql udf提权)

端口 nmap主机发现 nmap -sn 192.168.72.0/24 ​ Nmap scan report for 192.168.72.170 Host is up (0.00020s latency). ​ 170是新出现的机器,他就是靶机 nmap端口扫描 nmap -Pn 192.168.72.170 -p- --min-rate 10000 -oA nmap/scan 扫描开放端口保存到 nmap/sca…

Sony IMX334LQR-C 1/1.8寸 8.42 M像素

索尼IMX334LQR宽动态超星光级交通监测CMOS 封装:LGA 对⾓线:8.86 mm(类型1/1.8) 索尼IMX334LQR宽动态超星光级交通监测CMOS的参数及规格书资料: IMX334LQR-C是⼀个对⾓线8.86 mm(类型1/1.8)的…

帕金森病:这五大幕后推手,你了解多少?

在快节奏的现代生活中,健康问题日益受到公众的关注,而帕金森病作为一种常见的神经系统退行性疾病,更是牵动着无数家庭的心弦。今天,就让我们一起揭开帕金森病的神秘面纱,探讨其背后的五大主要原因,让更多人…

离散化c++

应用于数字取值范围很大,但数字个数很少的情况,原理是将要用到的数字放到一个连续的数组中,通过一个函数find得到数字和存放在数组中的下标的映射关系。 其中find函数的实现可以通过二分查找来实现; 练习题: 题意&…

Python 类型提示全解析:从入门到精通的必备技巧(如何让Python代码更清晰、错误更少)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 文章内容 📒📝 什么是类型提示?📝 类型提示的基本用法📝 高级用法📝 类型提示的工具和技巧📝 注意事项和最佳实践⚓️ 相关链接 ⚓️📖 介绍 📖 在编程的世界里,代码的清晰和可维护性是成功的关键。尤其是在 …

C++——关联式容器(5):哈希表

7.哈希表 7.1 哈希表引入 哈希表的出现依旧是为了查找方便而设计的。在顺序结构中,查询一个值需要一一比较,复杂度为O(N);在平衡树中,查询变为了二分查找,复杂度为O(logN);而对于哈希表,我们可…

SpringBoot简易商品管理系统

> 这是一个基于SpringBootThymeleaf实现的简易商品管理系统。 > 包含基本的登录/注册与商品管理功能。 > 界面简洁美观,代码结构清晰,适用于JAVA初学者在此基础上进行二次开发。 一、项目演示 二、技术框架 框架描述Spring Boot容器管理 S…

毫米波雷达预警功能 —— 开门预警(DOW)

文档声明: 以下资料均属于本人在学习过程中产出的学习笔记,如果错误或者遗漏之处,请多多指正。并且该文档在后期会随着学习的深入不断补充完善。感谢各位的参考查看。 笔记资料仅供学习交流使用,转载请标明出处,谢谢配…

16代现场实拍图

64*32 全彩 LED 点阵显示屏 无线通信868M,跳频通信 通信速率200K/50K 覆盖20-30米以上的通信半径 尺寸:192*96mm 供电方式:24V外置电源 储存温度:-40℃~80℃ 工作温度:-20℃~50℃ 自定义双向通信协议&#xff…