自定义类型:结构体【上】

在这里插入图片描述


一.结构体类型的声明

结构是一些值的集合,这些值称为成员变量,结构的每个成员可以是不同类型的变量。结构的声明基本形式:

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

例如描述一个学生:

在这里插入图片描述


二.结构体变量的创建和初始化

我们直接先来看一个例子:

在这里插入图片描述

s1,s2,s3都是结构体变量,这些变量和上面的s4,s5,s6变量是一个道理的,但是上面的是全局的结构体变量,下面的是局部变量。

初始化的时候,因为结构体不是一个成员,我们要用大括号初始化,按着顺序一个一个给值,对变量初始化,这就是结构体变量的初始化。

比如:

在这里插入图片描述

我们还可以用另一种方式赋值。

在这里插入图片描述


三.结构成员访问操作符

我们举例来看怎么样访问结构体成员,并顺便把它打印出来。

在这里插入图片描述

这里用到了.操作符,用法是:结构体变量名.成员名。


四.结构体的特殊声明

在声明结构的时候,可以不完全的声明,比如:

在这里插入图片描述

这个时候结构体类型是没有名字的,这个结构体类型就叫做匿名结构体类型。匿名结构体-这种类型只能使用一次,因为它无法再进行创建变量。就是第一次创建这结构体类型的时候,用这个类型直接创建一个变量,只用一次,以后再也用不上了。

我们再来看这个代码:

在这里插入图片描述

第二段代码之前的是结构体指针类型,结构体类型加一个星就是结构体指针类型,p就是指针变量,所以p可以存放地址,那我们到底能不能将x的地址赋给p呢?

在这里插入图片描述

显然实际上是不行的,会报警告,编译器会认为这是两种不同的类型,因为这两个结构体连名字都没有,无法识别类型,所以当你赋值的时候会报警告。

编译器会把上面的两个声明当成完全不同的两个类型,所以是非法的。匿名的结构体类型,如果没有对结构体类型重命名的话,基本上只能使用一次。一定要记住:如果你要匿名,你要保证只用一次。


五.结构的自引用

这个结点能存数据又能有义务找到下一个结点,那该怎么做呢?我们先画图理解一下:

在这里插入图片描述

那我们把这个结点设置一个结构体,让它既包含数据,又包含下一个结点,每个结点都能包含一个数据和一个结点。那我们这样做到底行不行呢?

在这里插入图片描述

其实是不行的。我们怎么算这个结构体大小是多少?一个结点包含一个同类型的结点,那就是结点里面套结点,结点里面套结点,一直下去,理论上这个结点的大小是无限大的。所以这种写法一定是错误的。

那像链表这些结构怎么来定义呢?我们不就是想要这个结点找到下一个结点吗?,我们把下一个结点的地址放到上一个结点中不就行了。来看:

在这里插入图片描述

这个时候大小就比较好算了,一个指针不就是4个或8个字节,还有一个整型4个字节,所以整体结构体大小我们也能算出来。

这就是结构体自引用,一个结构体变量里面想找到跟它同类型的其他结点,那我们就可以用一个结构体指针变量作为这个结构体的成员。其实链表就是基于这种形式实现的,它的结点就是像我们上面的写的代码一样定义的。

正确的自引用方式:

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

在结构体自引用使用的过程中,夹杂了typedef对匿名结构体类型重命名,也容易引起问题,我们来看下面的代码:

在这里插入图片描述

我们用typedef重命名结构体名字为:Node,我们括号里面成员也改成Node* next,我们这样写有问题吗?

在这里插入图片描述

我们发现报错了,意思是当我们在括号里面成员使用Node的时候还没有Node。我们是有这个结构体类型才产生名字Node,而你在括号里面就提前用到了Node,这样是不行的,那我们怎么办呢?请看下面:

在这里插入图片描述

所以当你这结构体里面有同类型指针的时候,不要用它重命名新的名字,用旧的名字。从上面我们看到结构体有对齐方式,这是什么意思?,这就是我们将要讲的结构体内存对齐。

敬请期待下一篇,读下来对你有用的话,请给作者留下一个

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Golang正则表达式详解:regexp包的应用与最佳实践

Golang正则表达式详解:regexp包的应用与最佳实践 引言基本概念与正则表达式基础正则表达式简介基本语法和字符普通字符元字符 常用的正则表达式模式示例 regexp 包的基本用法导入 regexp 包编译正则表达式CompileMustCompile 简单匹配MatchMatchString 示例 高级匹配…

Qt小bug — LINK : fatal error LNK1158: 无法运行“rc.exe“

Qt小bug —— LINK :fatal error LNK1158:无法运行"rc.exe" 环境 Qt 5.14.2 MSVC 2015 x64 现象 解决 在电脑上找到rc.exe 和rcdll.dll (一般在C:\Program Files(x86)\Windows Kits*\bin\x64下面)拷贝到 C:\Qt\Qt5…

从SQL Server过渡到PostgreSQL:理解模式的差异

前言 随着越来越多的企业转向开源技术,商业数据库管理员和开发者也逐渐面临向PostgreSQL迁移的需求。 虽然SQL Server和PostgreSQL共享许多数据库管理系统(RDBMS)的基本概念,但它们在处理某些结构上的差异可能会让人感到困惑&…

吴恩达深度学习笔记(3)--深度学习的实际应用

训练、开发、测试集 目前超参数的确定依赖于实验迭代调整,将数据集划分为:训练、开发(验证)、测试集会使迭代效率更高。 如果数据少的时候用传统的分割方法:60/20/20,数据量大的时候则都可以。 确保开发和…

LeetCode刷题练习--第1-10题

一、两数之和 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。 你可以按任意顺序返回…

线上游戏 线下陪玩线下家政陪聊陪诊陪游系统多少钱

关于线上游戏、线下陪玩、线下家政、陪聊、陪诊、陪游等系统的价格,由于这些服务涉及多个不同的行业和领域,且每个行业内部的定价也会因服务内容、服务质量、服务地区、服务提供商等多种因素而有所不同,因此很难给出一个统一的答案。 一般来…

Unity中实现预制体自动巡逻与攻击敌人的完整实现指南

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

抽象工厂模式(Abstract Factory Pattern)

抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它能创建一系列相关的对象,而无需指定其具体类,另一种说法是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。它提供了一种创建对象的最…

基于Arduino的智能恒温器

自制智能恒温器 在智能家居的浪潮中,智能恒温器作为提升居住舒适度的重要设备,越来越受到关注。本文将详细介绍如何自制一个开源智能恒温器,涵盖项目简介、所需材料、硬件组装、软件编程、测试与校准等步骤,帮助您轻松打造一个符…

一键找回,2024四大固态硬盘数据恢复工具推荐!

虽然固态硬盘(SSD)因其读写速度快、功耗低等特点受到广泛欢迎,但它并非无懈可击,数据丢失的问题依然存在。如果你也遇到了固态硬盘数据丢失的问题,那么一下的这几款软件可以一试! 福昕数据恢复 直达链接&…

AI网关在应用集成中起到什么作用?

现在,国内外几乎每个SaaS服务商都找到办法把大型语言模型(LLM)集成到自己的产品里。印证了那句话“每款SaaS都值得用AI重做一遍”我们暂且不讨论是否值得用AI重做,但是增加AI的功能,确实能让产品有更多的卖点。 通过整…

Gin框架操作指南04:GET绑定

官方文档地址(中文):https://gin-gonic.com/zh-cn/docs/ 注:没用过Gin的读者强烈建议先阅读第一节:Gin操作指南:开山篇。 本节演示GET绑定,包括绑定表单数据至自定义结构体,绑定查询…

精心整理85道Java微服务面试题(含答案)

微服务 面试题 1、您对微服务有何了解? 2、微服务架构有哪些优势? 3。微服务有哪些特点? 4、设计微服务的最佳实践是什么? 5、微服务架构如何运作? 6、微服务架构的优缺点是什么? 7、单片&#xff0…

[Python学习日记-48] Python 中的时间处理模块—— time 与 datetime

[Python学习日记-48] Python 中的时间处理模块 简介 Python 中表示时间的几种方式 UTC 时间 time 模块 datetime 模块 简介 在平常的代码中,我们常常需要与时间打交道。在 Python 中,与时间处理有关的模块就包括:time、datetime、calend…

vue3学习之插槽slot

关于slot web组件内部的占位符,可以使用自己的标记填充这个占位符 ,具名插槽就是在slot标签上添加name属性(https://developer.mozilla.org/zh-CN/docs/Web/HTML/Element/slot) vue3官方文档:https://cn.vuejs.org/gui…

回归本真 治愈心灵——汪青《在西行的路上》

回归本真 治愈心灵——汪青《在西行的路上》 知天地、忧生存、明自我。汪青的作品《在西行的路上》主体书写的是描述自己的西北之行。本书在创作之初,作者本人用文字表现不一样的风景,传递出更多美好的瞬间。作者将应用崭新的知识混合脚步踏出的历程&am…

控制层接受用户输入-系统架构师(八十一)

1在MVC设计模式中,以下说法正确的是()。 A 控制器表示业务逻辑 B 视图接受用户输入 C 模型表示业务数据 D 一个模型只能为一个视图提供数据 解析: 控制器接受用户输入。 所以C对 2下列()设置可以隔离…

jmeter使用csv数据

背景 使用jmeter对系统进行压测。测试数据存储在了csv中,多线程压测的时候,csv中的一条数据不能多个线程同时使用,数据全部使用过后,需要终止压测。 功能点 从csv读取数据后,完成接口数据拼接。多线程依次从csv文件…

大数据-170 Elasticsearch 云服务器三节点集群搭建 测试运行

点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完&am…

集师知识付费小程序:打造培训机构在线教育的金字招牌 集师知识付费系统 集师知识付费小程序 集师知识服务系统 集师线上培训系统 集师线上卖课小程序

在数字化浪潮的推动下,在线教育已成为教育领域的热门话题。而在众多在线教育平台中,集师知识付费小程序凭借其独特的定位和创新的模式,成功为培训机构打造了一张闪亮的在线教育金字招牌。 集师知识付费小程序,是一个集课程展示、…