细讲结构体

结构体是一些值的集合,这些值就是成员变量,这些变量可以是不同类型的。
当我们存放一个学生的信息是,包括性别,姓名,学号,年龄等内容,这些值是不同类型的,这是我们就可以使用结构体来存放这个学生的信息。

文章目录

  • 结构体的创建和初始化
  • 结构体的自引用
  • 结构体内存对齐
  • 结构体传参

结构体的创建和初始化

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

这就是一个用来存放学生信息的结构体的创建。

struct stu {char name[20];int age;char sex[5];char id[20];
};int main() {struct stu s1 = {"zhangsna", 20, "nan", "2022010202"};struct stu s2 = {"liis", 21, "nv", "2022010203"};printf("%s", s2.id);return 0;
}

结构体的初始化可以是上述代码中的方式。
s2.id就是取出第二个学生的学号,

.和-> 是结构体中的两个操作符。

. 操作符用来查找结构体中的成员变量
打印结构体中的一个成员 s1.a 就是结构体中的字符变量
.操作符结构成员访问操作符,左面是结构体变量,右面是结构体成员名
结构体指针
struct stu ps=&s1
ps->a
就是找到成员变量a

结构体的自引用

在结构中包含⼀个类型为该结构本⾝的成员是否可以呢?

看下面的代码

struct Node
{int date;struct Node next;
};

看这个结构体,那么,你来试着计算一下这个结构体的大小,
显然,这样的结构i体是不正确的,它的大小会无穷大。

自引用是我们应该使用指针,
正确的自引用

struct Node
{int date;struct Node *next;
};

这可以在之后的链表中用到,通过指针找到下一个date。

结构体内存对齐

我们先来看看结构体大小,
在这里插入图片描述
这里的s是一个定义的全局变量,

看计算结果是12,这是为什么呢,
这就要了解一下结构体内存的对齐规则吧,来探讨一下为什么是12.

  1. 结构体的第⼀个成员对⻬到和结构体变量起始位置偏移量为0的地址处
  2. 其他成员变量要对⻬到某个数字(对⻬数)的整数倍的地址处。
    对⻬数 = 编译器默认的⼀个对⻬数 与 该成员变量⼤⼩的较⼩值。
    VS 中默认的值为 8
    Linux中 gcc 没有默认对⻬数,对⻬数就是成员⾃⾝的⼤⼩
  3. 结构体总⼤⼩为最⼤对⻬数(结构体中每个成员变量都有⼀个对⻬数,所有对⻬数中最⼤的)的
    整数倍。
  4. 如果嵌套了结构体的情况,嵌套的结构体成员对⻬到⾃⼰的成员中最⼤对⻬数的整数倍处,结构
    体的整体⼤⼩就是所有最⼤对⻬数(含嵌套结构体中成员的对⻬数)的整数倍。

在这里插入图片描述
右边对应偏移量
在这里插入图片描述
所以这个结构体的大小为12。

接着,我们来看几个例子来更好的理解结构体的对其规则。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

内存对齐的原因

数据结构(尤其是栈)应该尽可能地在⾃然边界上对⻬。原因在于,为了访问未对⻬的内存,处理器需要
作两次内存访问;⽽对⻬的内存访问仅需要⼀次访问。假设⼀个处理器总是从内存中取8个字节,则地
址必须是8的倍数。如果我们能保证将所有的double类型的数据的地址都对⻬成8的倍数,那么就可以
⽤⼀个内存操作来读或者写值了。否则,我们可能需要执⾏两次内存访问,因为对象可能被分放在两
个8字节内存块中。

简单来说结构体对齐虽然使内存上存在浪费,但是这也提高了程序的速度,就是以空间来换时间

在创建结构体时也要巧妙利用成员顺序来节省空间
在这里插入图片描述
sizeof(S1)=8
sizeof(S2)=12
像S1,让占⽤空间⼩的成员尽量集中在⼀起

结构体传参

struct S {int data[1000];int num;
};struct S s = {{1, 2, 3, 4}, 1000};//结构体传参
void print1(struct S s) {printf("%d\n", s.num);
}//结构体地址传参
void print2(struct S *ps) {printf("%d\n", ps->num);
}int main() {print1(s);print2(&s);return 0;
}

这是结构体传参的两种方式,

结构体传参的时候,要传结构体的地址。

函数传参的时候,参数是需要压栈,会有时间和空间上的系统开销。
如果传递⼀个结构体对象的时候,结构体过⼤,参数压栈的的系统开销⽐较⼤,所以会导致性能的下降。

就到这里。

有错误请指出,感谢观看

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

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

相关文章

二叉树的层平均值[中等]

优质博文:IT-BLOG-CN 一、题目 给定一个非空二叉树的根节点 root , 以数组的形式返回每一层节点的平均值。与实际答案相差 10-5 以内的答案可以被接受。 示例 1: 输入:root [3,9,20,null,null,15,7] 输出:[3.00000,14.50000,1…

外置固态硬盘配置

1、插上usb外置硬盘盒 2、邮件我的此“电脑”选择“管理” 3、例如新增的固态硬盘如下: 4、这里我选择mrb(旧模式)而没选guid(新模式) 因为mrb兼容模式更加适合windows、ios等系统 5、右击未分区磁盘,选择新增卷区,一路下一步即可

《俏丽》正规万方收录普刊投稿发表

《俏丽》期刊是国家新闻出版总署批准的正规期刊,万方期刊网收录。安排文化、教育相关稿件,适用于评职称时的论文发表(单位有特殊要求除外),具体投稿方式请小窗我。 收稿方向、栏目参考:教育研究、课堂教学…

Python正则

match()和search()方法是re模块中用于正则表达式匹配的两个函数,而不是research()。 match()方法从字符串开头开始匹配,只有当模式从字符串的起始位置开始匹配成功时才会返回匹配对象。如果模式无法从字符串起始位置匹配成功,则返回None。 …

C语言课程设计

内容与设计思想 1、系统功能与分析&#xff08;填写你所设计的菜单及流程图&#xff09;。 菜单&#xff1a; 日历打印 日历推算 日历间隔倒计时牌 退出程序 模块设计 根据功能需要&#xff1a; 源文件&#xff1a; #include<stdio.h> #include&…

采样率越高噪声越大?

ADC采样率指的是模拟到数字转换器&#xff08;ADC&#xff09;对模拟信号进行采样的速率。在数字信号处理系统中&#xff0c;模拟信号首先通过ADC转换为数字形式&#xff0c;以便计算机或其他数字设备能够处理它们。 ADC采样率通常以每秒采样的次数来表示&#xff0c;单位为赫…

用Pandas轻松进行7项基本数据检查

大家好&#xff0c;作为一名数据工程师&#xff0c;面对糟糕的数据质量&#xff0c;可以使用Pandas执行快捷的数据质量检查。本文使用scikit-learn提供的California Housing数据集&#xff0c;进行基本数据检查。 一、California Housing数据集概述 【数据集】&#xff1a; …

【管理运筹学】背诵手册(七)| 网络计划与排队论

七、网络计划 网络图中的第一个事项称为起始事项&#xff0c;它只表示整个任务的开始&#xff1b;而最后一个事项称为终止事项&#xff0c;它只表示整个任务的结束&#xff1b;介于起始事项和终止事项之间的所有事项都称为中间事项&#xff0c;它既表示前项工作的结束&#xf…

智能优化算法应用:基于广义正态分布算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于广义正态分布算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于广义正态分布算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.广义正态分布算法4.实验参数设定5.算…

智能优化算法应用:基于原子轨道搜索算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于原子轨道搜索算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于原子轨道搜索算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.原子轨道搜索算法4.实验参数设定5.算…

Python 作业答疑_6.15~6.18

一、Python 一班 1. 比较字符串 1.1 问题描述 比较两个字符串A和B&#xff0c;字符串A和B中的字符都是大写字母&#xff0c;确定A中是否包含B中所有的字符。 1.2 问题示例 例如&#xff0c;给出A"ABCD"&#xff0c;B"ACD"&#xff0c;返回True&#x…

硬件基础:差模和共模

一直以来&#xff0c;都难以理解差模和共模这两个概念&#xff0c;什么差分信号、差模信号、共模信号&#xff0c;差模干扰、共模干扰……虽然看了一些资料&#xff0c;但貌似说法还挺多的&#xff0c;理解起来仍然是一头雾水。所以&#xff0c;专门用一篇文章来好好研究下这个…

结构体对齐和补齐

结构体的对齐和补齐的规则&#xff1a; 对齐&#xff1a;假定从零地址开始&#xff0c;每成员的起始地址编号&#xff0c;必须是它本身字节数的整数倍。 补齐&#xff1a;结构的总字节数必须是它最大成员的整数倍。 注意&#xff1a;在Linux系统下计算补齐、对齐时&#xff0c;…

算法学习系列(六):高精度加法、减法、乘法、除法

目录 引言一、高精度加法1.题目描述2.代码实现3.测试 二、高精度减法1.题目描述2.代码实现3.测试 三、高精度乘法1.题目描述2.代码实现3.测试 四、高精度除法1.题目描述2.代码实现3.测试 引言 本文介绍了高精度加法、高精度减法、高精度乘法、高精度除法&#xff0c;这个高精度…

软件开发自动化到智能文档检索:大语言模型驱动的开源项目盘点 | 开源专题 No.46

shroominic/codeinterpreter-api Stars: 2.4k License: MIT 这是一个 ChatGPT 代码解释器的开源实现项目&#xff0c;使用了 LangChain 和 CodeBoxes 进行后端沙盒式 Python 代码执行。该项目具有以下特性和优势&#xff1a; 数据集分析、股票图表绘制、图像处理等功能支持网…

KubeSphere Marketpalce 上新!Databend Playground 助力快速启动数据分析环境

12 月 5 日&#xff0c;Databend Labs 旗下 Databend Playground&#xff08;社区尝鲜版&#xff09;成功上架青云科技旗下 KubeSphere Marketplace 云原生应用扩展市场&#xff0c;为用户提供一个快速学习和验证 Databend 解决方案的实验环境。 关于 Databend Playground Dat…

Flask之手搓bootstrap翻页

使用bootstrap框架的翻页组件时&#xff0c;记起在学习使用laravel框架的时候&#xff0c;只需要添加相应的功能代码&#xff0c;就可以直接使用翻页组件了&#xff0c;但缺少自定义&#xff0c;或者说自定义起来有点麻烦。 自己手搓翻页组件&#xff0c;不仅能加深对flask的认…

Java架构师系统架构设计服务拆分应用

目录 1 概论2 微服务应用的分层架构-阿里系应用内部模块分层3 如何从不同维度对服务进行拆分4【案例分析】阿里新零售业务的微服务拆分5 如何理解微服务的无状态化6 如何通过接口版本控制实现向后兼容7 可用性的保障手段-流量整形8 如何设计网关层限流和分布式限流9 EDA事件驱动…

STM32基础教程 p18 UART通信协议基础知识

1 UART通信协议简介 UART通信协议详细介绍 1.1 串行通信的简介 1. 单工通信&#xff1a;学校广播 2. 半双工通信&#xff1a;对讲机 3. 全双工通信&#xff1a;手机打电话 UART:通用的同步异步收发器 1.1.1 同步通信 组成&#xff1a;数据线、时钟线、偏选信号线 收发双方…

从文字到使用,一文读懂Kafka服务使用

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…