C语言进阶版第16课—自定义类型:结构体

文章目录

  • 1. 结构体类型的声明和初始化
  • 2. 结构体自引用
  • 3. 结构体内存对齐
    • 3.1 结构体内存对齐规则
    • 3.2 修改默认对齐数
  • 4. 结构体传参
  • 4. 结构体实现位段
  • 5. 位段使用的注意事项

1. 结构体类型的声明和初始化

  结构体在使用之前都要对其类型进行声明,关键字是struct,就像我们经常使用printf函数一样,包含stdio.h头文件也是告诉编译器,我们要使用该头文件里面的函数,自定义函数也是如此,需要先声明再使用
在这里插入图片描述


  • 当然也可能碰见结构体在声明结构体时,会出现不完全声明
  • 这种就是结构体的匿名声明

在这里插入图片描述

2. 结构体自引用

  结构体里能否放入一个同类型的结构体呢?
在这里插入图片描述


  • 那么如何实现结构体自引用呢?

在这里插入图片描述


3. 结构体内存对齐

3.1 结构体内存对齐规则

  我们先看一段代码
在这里插入图片描述

  原因呢,与结构体内存对齐有关

  • 结构体内存对齐规则
  • 结构体的第一个成员对齐到和结构体变量起始位置偏移量为0的地址处
  • 其他成员变量要对齐到对齐数的整数倍地址处
  • 对齐数 = 编译器默认的一个对齐数和该成员变量自身大小的较小值
  • VS 中对齐数是 8
  • Linux中 gcc 没有默认对齐数,对齐数是成员本身大小
  • 结构体总大小为最大对齐数(包括第一个成员的对齐数,所有成员中最大的对齐数)的整数倍

在这里插入图片描述


在这里插入图片描述


  • 结构体嵌套内存对齐的规则
  • 如果结构体发生嵌套使用,那么嵌套的结构体成员对齐到自己的成员中最大对齐数的整数倍处,结构体的总大小就是最大对齐数(含嵌套结构体)的整数倍

在这里插入图片描述


在这里插入图片描述


  • 通过以上例子我们可以看出,结构体在存储时会浪费一部分内存
  • 为了避免浪费过多的内存,尽量让占用内存空间小的成员集中在一起
//内存浪费过多
struct S2
{char c1;int n;char c2;
};
//内存浪费过少
struct S1
{char c1;char c2;int n;
};

3.2 修改默认对齐数

  • 同时我们也可以修改默认的对齐数
  • # pragma 这个预处理指令,可修改编译器的默认对齐数

在这里插入图片描述


在这里插入图片描述


4. 结构体传参

  • 结构体传参有两种形式,一种是结构体变量传参,一种是结构体变量地址传参

在这里插入图片描述


在这里插入图片描述


  • 结构体变量在传参时,形参会创建一个跟实参大小相同的结构体,对于占据较大内存空间的结构体来说有点浪费空间,而结构体变量地址传参时,它最多接收4/8个字节,因此大大缩小了占用内存
  • 结构体传参尽量使用传址的形式

4. 结构体实现位段

  • 位段的定义
  • 位段的成员是int、unsigned int、signed int或char等类型
  • 位段成员名后边有一个冒号和一个数字

在这里插入图片描述


  • 那么位段成员冒号后面的数字是什么意思呢?
  • 数字表示该变量占多少个bit位

在这里插入图片描述


在这里插入图片描述


  对比以上可知,位段在使用时比结构体节省空间,尽管位段在使用时可以大大节省空间,但由于它存在跨平台的问题,不同的平台位段的大小不确定,位段成员的内存分配是从右开始还是从左开始未定义,内存是否存在舍弃存储的现象等等,因此使用时需特别注意

5. 位段使用的注意事项

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Pandas -----------------------基础知识(主要matplotlib知识)(七)

Dataframe变形 转置 T import pandas as pddata {2022: [10, 30, 15, 20], 2023: [40, 50, 36, 21]} df1 pd.DataFrame(data, index[q1, q2, q3, q4]) print("原始数据框:") print(df1)df2 df1.Tprint("转换后数据框:") print(df…

计算机视觉算法知识详解(含代码示例)

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…

FRP搭建内网穿透:云服务端 + 家用Linux/Windows主机【2024】

介绍 FRP是一个可以自己搭建内网穿透服务的开源项目,开源地址直达: FRP-GitHub 实际上frp由两个程序组成 ①frps:在服务端运行的程序 ②frpc:在客户端运行的程序 运作方式示意图如下 服务端 因为服务上使用了1Panel面板,直接在应用商店安…

【算法系列-链表】删除链表的倒数第N个结点

【算法系列-链表】删除链表的倒数第N个结点 文章目录 【算法系列-链表】删除链表的倒数第N个结点1. 算法分析🛸2. 模拟解决问题2.1 思路分析🎯2.2 代码示例🌰 3. 双指针(快慢指针)解决问题3.1 思路分析🎯3.2 代码示例&#x1f330…

软件验证与确认实验二-单元测试

目录 1. 实验目的及要求.................................................................................................... 3 2. 实验软硬件环境.................................................................................................... 3 …

进阶岛第4关:InternVL 多模态模型部署微调实践

准备InternVL模型 我们使用InternVL2-2B模型。该模型已在share文件夹下挂载好,现在让我们把移动出来。 mkdir -p /root/project/joke/modelcp -r /root/share/new_models/OpenGVLab/InternVL2-2B /root/project/joke/model # 不用ln -s 准备环境 这里我们来手动配…

Brave编译指南2024 MacOS篇-构建与运行(六)

引言 在上一篇文章中,我们成功初始化了Brave浏览器的构建环境。现在,我们进入了这个编译指南的核心部分:实际构建Brave浏览器并运行它。这个过程将把我们之前准备的所有源代码和依赖项转化为一个可运行的浏览器实例。 1. 编译Brave浏览器 …

【进阶OpenCV】 (5)--指纹验证

文章目录 指纹验证1. 验证原理2. 读取图片3. 计算特征匹配点 总结 指纹验证 指纹验证基于人类指纹的独特性和稳定性。每个人的指纹在图案、断点和交叉点上各不相同,这种唯一性和终生不变性使得指纹成为身份验证的可靠手段。指纹识别技术通过采集和分析指纹图像&…

docker 部署nacos

目录 一、拉取镜像 二、部署 三、访问(默认是用内嵌数据库) 四、配置 五、重启容器 一、拉取镜像 docker pull nacos/nacos-server 二、部署 docker run --name nacos -d -p 8848:8848 -p 9848:9848 -p 9849:9849 --restartalways --privilegedt…

算法笔记(十)——队列+宽搜

文章目录 N 叉数的层序遍历二叉树的锯齿形层序遍历二叉树最大宽度在每个树行中找最大值 BFS是图上最基础、最重要的搜索算法之一; 每次都尝试访问同一层的节点如果同一层都访问完了,再访问下一层 BFS基本框架 void bfs(起始点) {将起始点放入队列中;标记…

Docker启动 Redis提示:Can‘t initialize Background Jobg

问题说明: 在使用docker启动redis失败,但是查看容器日志,除了提示 Fatal:Cant initialize Background Jobg,没有其他错误信息。经过长时间查找资料及试错,现记录下可能的产生原因及解决方案,以便以后参考。 产生原因&…

【漏洞复现】锐捷 RG-EW1200G 无线路由器 登录绕过

》》》产品描述《《《 锐捷网络RG-EW1200G是一款有线无线全千兆双频无线路由器Q,适合平层家居、别墅、小型店铺、SOHO办公等场景使用。设备性能卓越,足以满足千兆上网需求;信号强劲,信号功率功率提升3倍,覆盖距离提升近1倍覆盖能力…

【Linux】进程间关系与守护进程

超出能力之外的事, 如果永远不去做, 那你就永远无法进步。 --- 乌龟大师 《功夫熊猫》--- 进程间关系与守护进程 1 进程组2 会话3 控制终端4 作业控制5 守护进程 1 进程组 之前我们提到了进程的概念, 其实每一个进程除了有一个进程 ID(P…

算法: 二分查找题目练习

文章目录 二分查找二分查找在排序数组中查找元素的第一个和最后一个位置搜索插入位置x 的平方根山脉数组的峰顶索引寻找峰值寻找旋转排序数组中的最小值点名 总结精华模版 二分查找 二分查找 没啥可说的,轻轻松松~ class Solution {public int search(int[] nums, int target…

Pragmatic Task务实任务——指导语义通信的优化

1. 语义通信 语义通信(Semantic Communication)的核心理念是传递不仅仅是数据本身,而是数据所包含的“语义”或“意义”。这与传统通信系统不同,传统系统只注重如何准确、高效地传输数据,而语义通信则要求传输的信息能…

畅阅读小程序|畅阅读系统|基于java的畅阅读系统小程序设计与实现(源码+数据库+文档)

畅阅读系统小程序 目录 基于java的畅阅读系统小程序设计与实现 一、前言 二、系统功能设计 三、系统实现 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博主介绍:✌️大厂码农|毕设布道师…

基金好书入门阅读笔记《基金作战笔记:从投基新手到配置高手的进阶之路》1

今年的新书《基金作战笔记:从投基新手到配置高手的进阶之路》,趁着国庆前这个风潮,拿来学习下。 第一章 军规 军规1:莫求暴富,为自己设定一个长期目标。 军规2:永不满仓,找到自己的资产配置中…

Pikachu-Sql Inject-数字型注入(GET)

一、、破解 SQL 查询语句中的字段数 ?id1 order by 3 -- // -- 是注释, 加号 在MySQL中会转成空格 order by 1 ,by 数字几,就是按照第几列进行排序;如果没有这一行,则报错 如:以下语句,根据…

Pytorch实现RNN实验

一、实验要求 用 Pytorch 模块的 RNN 实现生成唐诗。要求给定一个字能够生成一首唐诗。 二、实验目的 理解循环神经网络(RNN)的基本原理:通过构建一个基于RNN的诗歌生成模型,学会RNN是如何处理序列数据的,以及如何在…

微信小程序使用picker,数组怎么设置默认值

默认先显示请选择XXX。然后点击弹出选择列表。如果默认value是0的话&#xff0c;他就直接默认显示数组的第一个了。<picker mode"selector" :value"planIndex" :range"planStatus" range-key"label" change"bindPlanChange&qu…