当前位置: 首页 > news >正文

第四十九天学习记录:C语言进阶:结构体

结构体

结构体的声明

结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量

struct tag
{member-list;
}variable-list;

问:C++的new和C语言的结构体有什么异同?
ChatAI答:
C++中的new是一个运算符,用于在堆上分配动态内存,并返回指向该内存的地址。它会自动调用要分配的对象的构造函数,以便初始化新分配的内存。与之相反,C语言中的结构体只是一种用户自定义的数据类型。我们可以在栈上或者堆上申请结构体变量内存,但在C语言中不会自动调用结构体的构造函数。

C++中的new还有一个重载版本,可以显式地调用类的构造函数来初始化新分配的内存。而在C语言中,如果结构体中有指向其他类型的指针,需要手动分配空间并进行初始化,否则可能导致内存泄漏或者越界错误。

此外,C++中的new还可以抛出异常,而C语言中的结构体是不支持异常处理的。

综上所述,C++中的new提供了更高级别的内存分配方式,同时还能够自动调用构造函数来初始化,更加方便和安全。

问:匿名结构体可以声明了一个集合后再声明另外一个不一样集合的匿名结构体吗?

ChatAI答:
可以,匿名结构体的定义与使用方式与普通结构体一样,可以在同一作用域内用多个匿名结构体类型的变量或声明。

下面是一个示例代码:

#include <stdio.h>int main()
{struct {int x;int y;} s1 = {1, 2}, s2 = {3, 4};struct {double x;double y;} s3 = {1.23, 4.56}, s4 = {7.89, 9.87};printf("s1: x=%d, y=%d\n", s1.x, s1.y);printf("s2: x=%d, y=%d\n", s2.x, s2.y);printf("s3: x=%f, y=%f\n", s3.x, s3.y);printf("s4: x=%f, y=%f\n", s4.x, s4.y);return 0;
}

在这个例子中,我们在同一作用域内定义了两个不同的匿名结构体,其中s1s2类型相同,而s3s4类型相同。可以看到,它们被视为两个不同的结构体类型,内部成员的类型和名称可以不同。在使用时,也没有区别,可以直接使用.操作符访问内部成员。

问:C++的链表和C的链表有何异同
ChatAI答:
C语言和C++语言中的链表在实现和使用上有一些异同点:

  1. 数据结构实现

    • C语言中通常使用结构体来实现链表的节点,结构体内部包含指向前驱和后继节点的指针。
    • C++语言中可以使用类(class)或结构体(struct)来实现链表节点,通过类或结构体实现的链表节点可以使用类的成员函数来实现插入、删除、遍历等操作。
  2. 头文件和命名空间

    • 在C语言中,链表通常以结构体和相关的函数以及宏定义形式定义在单独的头文件中,并且可能需要包含其他系统头文件以使用标准库函数、类型和宏定义等。
    • 在C++语言中,链表的实现通常放在类或命名空间中。例如,可以使用std::list来定义一个标准库中的链表实现。
  3. 模板支持

    • C语言不支持模板,因此需要在代码中每次为需要操作的数据类型编写专门的函数。
    • C++支持模板,可以使用通用的泛型编程方式来实现链表,从而支持对任何类型数据进行操作。
  4. 对象和构造函数/析构函数支持

    • 在C语言中,链表通常由一组函数和结构体成员变量构成,没有构造函数和析构函数的概念,因此需要手动初始化和清理链表的节点和指针。
    • 在C++语言中,链表可以作为一个对象来看待,支持使用构造函数和析构函数进行自动初始化和清理。必要的资源申请和释放由构造函数和析构函数负责处理,使用起来更加方便。

除了上述区别,C++语言中的链表还可以利用STL标准库提供的迭代器、算法和其他容器等功能,提供更丰富的数据结构和算法支持。总的来说,C++语言的链表实现更加现代化、方便、可靠和安全。

结构体内存对齐

#define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>struct S1
{char c1;int a;char c2;
};struct S2
{char c1;char c2;int a;
};struct S3   //16
{double d;char c;int i;
};struct S4   //32
{char c1;struct S3 s3;double d;
};int main()
{struct S1 s1 = { 0 };printf("%d\n", sizeof(s1));//12struct S2 s2 = { 0 };printf("%d\n", sizeof(s2));//8return 0;
}

输出:12 8

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

修改默认对齐数

#pragma pack(4)
#pragma pack()

C语言结构体偏移量

在C语言中,结构体是一种用户自定义的数据类型,它允许将不同的变量类型组合在一起,并按照用户定义的方式对它们进行存储。结构体中的每个成员在内存中是按照定义的顺序依次存放的,每个成员的偏移量从结构体变量的起始地址开始依次增加。可以使用C语言中的“offsetof”宏来计算结构体中各个成员的偏移量,语法如下:

#include <stddef.h>
#define offsetof(type, member) ((size_t) &((type *)0)->member)

其中,type表示结构体类型,member表示结构体成员名。使用这个宏,可以计算处任意结构体类型中指定成员的偏移量。

#define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>
#include <stddef.h>struct S
{char c;int i;double d;
};int main()
{//offsetof();printf("%d\n", offsetof(struct  S, c));printf("%d\n", offsetof(struct  S, i));printf("%d\n", offsetof(struct  S, d));return 0;
}

在这里插入图片描述

结构体传参

#define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>struct S
{char c;int a;double d;
};void Init(struct  S* ps)
{ps->a = 100;ps->c = 'w';ps->d = 3.14;
}int main()
{struct S s;Init(&s);return 0;
}

相关文章:

第四十九天学习记录:C语言进阶:结构体

结构体 结构体的声明 结构是一些值的集合&#xff0c;这些值称为成员变量。结构的每个成员可以是不同类型的变量 struct tag {member-list; }variable-list;问&#xff1a;C的new和C语言的结构体有什么异同&#xff1f; ChatAI答&#xff1a; C中的new是一个运算符&#xff…...

LeeCode [N字形变换]算法解析

关键字&#xff1a;数学归纳法 一、题目 将一个给定字符串 s 根据给定的行数 numRows &#xff0c;以从上往下、从左到右进行 Z 字形排列。 比如输入字符串为 "PAYPALISHIRING" 行数为 3 时&#xff0c;排列如下&#xff1a; P A H N A P L S I I G Y I R …...

CPU性能提升:流水线

一条指令的执行一般要经过取指令&#xff0c;翻译指令&#xff0c;执行指令3个基本流程。CPU内部的电路分为不同的单元&#xff0c;取指但愿&#xff0c;译码单元&#xff0c;执行单元等。指令的执行也是按照流水线工序一步步执行的。如图2-34所示&#xff0c;我们假设每一个步…...

C语言指针初级

目录 一、什么是指针 二、指针和指针类型 三、野指针 1.野指针的成因&#xff1a; 2.如何规避野指针 四、指针运算 1.指针-整数 2. 指针之间的加减 五、二级指针 六、指针数组 一个男人&#xff0c;到底要走多少的路&#xff0c;才能成为一个真正的男人 本专栏适用于…...

C++的历史

C是一种广泛使用的编程语言。C于1983年由丹尼斯里奇&#xff08;Dennis Ritchie&#xff09;在贝尔实验室创造&#xff0c;它是C语言的扩展。C的设计初衷是为了提高代码的可重用性和可维护性。它允许开发人员使用面向对象编程&#xff08;OOP&#xff09;范例&#xff0c;这使得…...

保姆级别!!!--全网绝对教你会!!教你如何使用MQTTFX连接阿里云平台中的设备----下期告诉你如何创建!

本期需要下载的软件 MQttfx安装包&#xff0c;本人打包的-嵌入式文档类资源-CSDN文库 目录 第一步&#xff1a;建造阿里云设备 这个可以先忽略建造步骤&#xff0c;下期将提供步骤。 第二步&#xff1a;下载mqttfx软件 第三步&#xff1a;填写密钥信息进行连接 查看三元…...

Unexpected token ‘‘‘, “‘{“type“:““... is not valid JSON

尝试低代码schema解析JSON时报错,奇怪的是控制台解析正常,项目js执行JSON.parse()报错,简直无语了,,, 只能挨个检查了,首先温习了下JSON 的标准格式: JSON的合法符号:{(左大括号) }(右大括号) "(双引号) :(冒号) ,(逗号) [(左中括号) ](右中括号) JSON字符串:…...

关于C语言的杂记5

文章目录 引入正文内部函数与外部函数相关数组的知识点数组的初始化测试一维数组在内存中存储的地址&#xff1a;遍历二维数组的值测试二维数组的地址(观察内存情况)数组下标为0开始的由来 两个数交换位置的三种方法 引入 写在前面&#xff1a;关于C语言这部分内容&#xff0c;…...

YOLOv5 vs YOLOv6 vs YOLOv7目标检测模型速度和准确度的性能比较——深入研究

如果您正在进行目标检测项目,您很可能会选择众多 YOLO 模型中的一种。从现有的 YOLO 对象检测模型的数量来看,如何选择最佳模型是一个艰难的选择。 您可能会发现自己正在考虑: 选择哪种 YOLO 模型以获得最佳 FPS? CPU 与 GPU 的推理速度如何?选择哪种 GPU?微型、小型、…...

如何增加网站权重?有效提高网站权重的技巧方法

权重对于网站优化来说非常的重要&#xff0c;那什么是网站权重呢&#xff1f;网站权重是指搜索引擎给网站&#xff08;包括网页&#xff09;赋予一定的权威值&#xff0c;对网站&#xff08;含网页&#xff09;权威的评估评价。一个网站权重越高&#xff0c;在搜索引擎所占的份…...

路径规划 | 图解快速随机扩展树RRT算法(附ROS C++/Python/Matlab仿真)

目录 0 专栏介绍1 什么是RRT算法?2 图解RRT算法原理3 算法仿真与实现3.1 ROS C++实现3.2 Python实现3.3 Matlab实现0 专栏介绍 🔥附C++/Python/Matlab全套代码🔥课程设计、毕业设计、创新竞赛必备!详细介绍全局规划(图搜索、采样法、智能算法等);局部规划(DWA、APF等);…...

【Stable Diffusion WebUI】一篇文章教你如何安装和使用Stable Diffusion WebUI

文章目录 Stable Diffusion WebUI1. 安装1.1 下载 stable-diffusion-webui1.2 运行 webui.sh 2. 安装插件2.1 命令行安装2.2 extensions 安装2.3 常用插件 3. 使用教程3.1 页面布局3.3 快捷栏设置3.3.1 PNG Info3.3.2 Tagger Stable Diffusion WebUI 1. 安装 1.1 下载 stable…...

Python篇——数据结构与算法(第二部分)

目录 二、排序算法&#xff08;承接第一部分&#xff09; 1、堆排序算法——树的基础知识补充 2、树的基本概念 3、二叉树基础知识 &#xff08;1&#xff09;满二叉树 &#xff08;2&#xff09;完全二叉树 &#xff08;3&#xff09;二叉树的存储方式&#xff08;表示方式…...

人工智能之读懂CNN卷积神经网络

通过往期文章的分享,我们了解了神经网络的结构,一般分为输入层,隐藏层,输出层 TensorFlow神经网络 那什么是卷积神经网络那,这就要我们追溯一下人类识别图像的原理 人类的视觉原理如下:从原始信号摄入开始(瞳孔摄入像素 Pixels),接着做初步处理(大脑皮层某些细胞发现…...

go手写Redis(1)之协议说明

手写Redis 参考大佬的go实现redis&#xff0c;自己实现一个简单版本的用于学习go以及网络编程相关 https://github.com/HDT3213/godis https://coding.imooc.com/class/576.html #慕课网课程 源码地址&#xff1a; https://gitee.com/haijun1998/go_redis RESP协议 Redis Ser…...

Hadoop/HbBase/Hive/HDFS/MapReduce都是什么?

目录 一图胜万言&#xff01;&#xff01; 解释说明 1. hadoop 2. hive 3. hbase 总结 一图胜万言&#xff01;&#xff01; 解释说明 1. hadoop 它是一个分布式计算分布式文件系统&#xff0c;前者其实就是 MapReduce&#xff0c;后者是 HDFS 。后者可以独立运行&…...

羽毛球中级提高班课后总结

2023.3.28第一课 &#x1f3f8;️四点对角线步伐练习&#x1f3f8;️ 1️⃣每一次接球一定要有启动步&#xff0c;脚跟离地&#xff1b; 2️⃣两边上网都是先迈右腿&#xff0c;加一个并步&#xff0c;最后一步大迈步&#xff0c;脚跟先落地&#xff1b; 3️⃣右边上网脚尖朝…...

多维时序预测 | Matlab基于最小二乘支持向量机LSSVM多维时间序列预测,LSSVM多变量时间序列预测

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 基于最小二乘支持向量机LSSVM多维时间序列预测LSSVM多变量时间序列预测,matlab代码 评价指标包括:MAPE、MAE、RMSE和R2等,代码质量极高,...

KDZK-F水轮发电机转子测试仪

一、产品概述 KDZK-F水轮发电机转子测试仪是判断发电机转子绕组有无匝间短路的专用仪器&#xff0c;可以自动、手动&#xff08;单向或双向&#xff09;测量转子绕组的电压、电流、阻抗、功率、相位角等参数。 二、功能与特点 旋转鼠标&#xff0c;操作更方便。 可选择快速的…...

I2C通信协议原理和MPU6050

一、串口通讯 只能在两个设备之间进行 若要三台设备两两通信&#xff0c;则每个设备得需要两组窗口&#xff0c;为3组相互独立的窗口通讯 为解决这个问题&#xff1a;设计了总线通讯&#xff0c;有多种&#xff0c;I2C为其中一种 二、I2C通信 &#xff08;1&#…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用&#xff1a;实现组件通用属性的渐变过渡效果&#xff0c;提升用户体验。支持属性&#xff1a;width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项&#xff1a; 布局类属性&#xff08;如宽高&#xff09;变化时&#…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具

作者&#xff1a;来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗&#xff1f;了解下一期 Elasticsearch Engineer 培训的时间吧&#xff01; Elasticsearch 拥有众多新功能&#xff0c;助你为自己…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)

宇树机器人多姿态起立控制强化学习框架论文解析 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架&#xff08;一&#xff09; 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

什么是EULA和DPA

文章目录 EULA&#xff08;End User License Agreement&#xff09;DPA&#xff08;Data Protection Agreement&#xff09;一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA&#xff08;End User License Agreement&#xff09; 定义&#xff1a; EULA即…...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点&#xff0c;但无自动故障转移能力&#xff0c;Master宕机后需人工切换&#xff0c;期间消息可能无法读取。Slave仅存储数据&#xff0c;无法主动升级为Master响应请求&#xff…...

3403. 从盒子中找出字典序最大的字符串 I

3403. 从盒子中找出字典序最大的字符串 I 题目链接&#xff1a;3403. 从盒子中找出字典序最大的字符串 I 代码如下&#xff1a; class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

css3笔记 (1) 自用

outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size&#xff1a;0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格&#xff…...

OPENCV形态学基础之二腐蚀

一.腐蚀的原理 (图1) 数学表达式&#xff1a;dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一&#xff0c;腐蚀跟膨胀属于反向操作&#xff0c;膨胀是把图像图像变大&#xff0c;而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

Mysql中select查询语句的执行过程

目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析&#xff08;Parser&#xff09; 2.4、执行sql 1. 预处理&#xff08;Preprocessor&#xff09; 2. 查询优化器&#xff08;Optimizer&#xff09; 3. 执行器…...

RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill

视觉语言模型&#xff08;Vision-Language Models, VLMs&#xff09;&#xff0c;为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展&#xff0c;机器人仍难以胜任复杂的长时程任务&#xff08;如家具装配&#xff09;&#xff0c;主要受限于人…...