结构体的简单介绍(2)

目录

结构体的特殊声明

结构体的自引用


结构体的特殊声明

在声明结构的时候,可以不完全的声明。

比如:

struct
{int a;char b;float c;
}x;

以上结构在声明的时候省略掉了结构体标签(tag)

那么会有什么影响呢?

int main()
{struct   x;return 0;
}

由于摘掉了标签,我们再main函数内进行变量赋值的时候,无从下手也无法成功赋值,所以得到结论,这种摘取标签的声明方式,只能使用一次,而这一次也只能是在声明的时候进行创建变量使用。

也就是这种声明,是一次性的。

 

又比如:

struct
{int a;char b;float c;
}x;struct
{int a;char b;float c;
}a[20], *p;

当不看标签 ,我们可以发现两个结构体的成员一样,所以当我们进行以下操作时,是否成立呢?

p = &x;

*p是一个结构体类型的指针变量,而x也是一个结构体类型的变量,且二者的结构体去除名字外,完全一样,那么我们是否可以将x的地址存放再p中呢?

答案是不允许的,因为编译器会把上⾯的两个声明当成完全不同的两个类型,所以是⾮法的。 匿名的结构体类型,如果没有对结构体类型重命名的话,基本上只能使⽤⼀次。 

结构体的自引用

什么叫做结构体的自引用?

拿数据结构中的顺序表举例,自引用就是当你找到一个数字1的时候,你可以通过数字1顺藤摸瓜找到数字2,又可以从数字2顺藤摸瓜找到数字3,以此类推。

 

 而结构体的自引用也是如此,不过其本身应该更类似与数据结构体中的链表。

通过1找到2,通过2找到3,通过3找到4,通过4找到5,这其中的每一个数字都是一个节点,这一个节点包含着前往下一个节点的线索,以此类推便可以顺藤摸瓜找到最后。

换到结构体身上便是一个结构体中包含着下一个结构体,且两个结构体是相同类型的,同名同标签(名 = 标签,不是变量名是结构体名)

那么就有了以下代码:

struct Node
{int data;struct Node next;
};
  • 但,这个代码真的正确吗?
  • 直接包含着下一个同类型同名的结构体,而这个被包含的结构体是否也包含着另一个同名的结构体 呢?
  • 就像俄罗斯套娃一样,结构体1内包含结构体2,结构体2包含结构体3,结构体3包含结构体4,等等。
  • 若这样,我们就不知道最外面那个结构体的大小是多少。
  • 所以,以上代码是错误的,这种无限套娃使得我们不知道最外面的结构体大小究竟是多少个字节。

而因此我们又通过了数据结构的链表特点诞生了以下代码:

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

根据链表的特点,我们将节点分为两个部分,一个部分存放的结构体本身的数据,另一个部分存放了下一个同类型同名的结构体的地址,这样便很好的解决了问题。

 

而同时,也会产生一种奇怪的写法:

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

使用typedef对一个结构体进行重命名,将这个特殊声明的结构体重新命名为了Node,但是这个结构体内部也有一个叫Node的成员,这就产生了歧义。

类似先有鸡还是先有蛋的问题出现了。

 但这种问题再编译器内部是不行的。

所以正确的写法是:定义结构体不要使⽤匿名结构体了

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

完善这个特殊声明,加上名字(标签),而后直接进行重命名为结构体的名字(标签)使用。 

 

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

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

相关文章

Unity 切换场景后场景变暗

问题 Unity版本:2019.4.34f1c1 主场景只有UI,没有灯光,天空盒;其他场景有灯光和天空盒所有场景不烘焙主场景作为启动场景运行,切换到其他场景,场景变暗某一个场景作为启动场景运行,光影效果正…

【zip密码】zip压缩包删除密码方法

Zip压缩包设置设置了密码,想要删除密码,除了将压缩包解压出来之后再将文件压缩为不带密码的压缩文件以外,还有一种删除密码的方法。设置方法如下: 右键点击zip文件,找到打开方式,以Windows资源管理器方式打…

数据结构:排序解析

文章目录 前言一、常见排序算法的实现1.插入排序1.直接插入排序2.希尔排序 2.交换排序1.冒泡排序2.快速排序1.hoare版2.挖坑版3.前后指针版4.改进版5.非递归版 3.选择排序1.直接选择排序2.堆排序 4.归并排序1.归并排序递归实现2.归并排序非递归实现 5.计数排序 二、排序算法复杂…

手写Mybatis:第17章-Plugin插件功能实现

文章目录 一、目标:Plugin插件二、设计:Plugin插件三、实现:Plugin插件3.1 工程结构3.2 Plugin插件代理模式类图3.3 自定义拦截注解3.3.1 方法签名3.3.2 拦截注解 3.4 拦截器接口定义3.4.1 调用信息3.4.2 拦截器接口 3.5 类代理包装操作3.5.1…

Vulnhub: Hogwarts: Bellatrix靶机

kali:192.168.111.111 靶机:192.168.111.228 信息收集 端口扫描 nmap -A -sC -v -sV -T5 -p- --scripthttp-enum 192.168.111.228访问80端口 查看源码,提示ikilledsiriusblack.php和文件包含的参数名file 漏洞利用 ikilledsiriusblack.p…

seata升级1.1.0后遇到io.seata.common.exception.ShouldNeverHappenException

我们这一节主要讲的是seata升级后的主要修改,至于seata的基本部署可以参考我之前的随笔。 一开始我在升级SpringBoot版本之后,seata就突然启动不起来了,报了下面的错: Caused by: io.seata.common.exception.ShouldNeverHappenExc…

etcd读写请求的执行过程

etcd读请求如何执行 首先,etcdctl 会对命令中的参数进行解析。在解析完请求中的参数后,etcdctl 会创建一个 clientv3 库对象通过gRPC API来访问 etcd server。对应流程一。 然后通过负载均衡算法选择一个etcd server节点,然后调用 etcd ser…

互联网医院|医疗系统新模式改善看病效率

伴随着互联网时代的进步,医疗也在不断的发展,越来越多的医院和诊所开始使用医疗软件。医疗软件广泛的被使用着,软件几乎覆盖了我们的日常生活。在我们日常生活当中健康一直是需求专业渠道,医疗软件开发会把用户的数据打造出一个数…

2023年了,java后端还有未来吗?

前言 Java当下确实是比较的内卷,但关键在于个人,可以看看不同地方(这里主要举例北上广深一线城市)对于Java开发工程师这个职位的具体要求: 在以下北上广深这些一线大城市的面试招聘当中不难看出,凡是工资…

电视盒子什么品牌好?数码博主盘点目前性能最好的电视盒子

电视盒子是非常重要的,老人小孩基本每天都会看电视,而电视盒子作为电视盒子的最佳拍档销量十分火爆,我自己每个月都会测评几次电视盒子,今天给大家详细解读一下电视盒子什么品牌好,看看目前性能最好的电视盒子是哪些&a…

危险边缘:揭示 Python 编程中易被忽视的四个安全陷阱

今天我们将要谈论一个非常重要的话题:Python 编程中的安全问题。作为一门广受欢迎的编程语言,Python 已经成为了许多开发者、计算机专业学生以及打工人的必备技能。 原文链接食用更佳 危险边缘:揭示 Python 编程中易被忽视的四个安全问题 然…

睿趣科技:抖音小店多久可以做起来

随着社交媒体的迅猛发展,抖音成为了全球最受欢迎的短视频平台之一,吸引了数以亿计的用户。在抖音上,人们不仅可以分享自己的生活、才艺和创意,还可以创业经营抖音小店。但是,很多人都想知道,一个抖音小店到…

10个免费PPT下载资源网站分享

PPT超级市场https://pptsupermarket.com/ PPT超级市场是一个完全免费的PPT模板下载网站,不需要注册登录,点击下载就能直接使用。 叮当设计https://www.dingdangsheji.com/ 叮当设计是一个完全免费的PPT模板下载网站,每一套PPT的质量都很高。除…

【Java从0到1学习】14 Java多线程

1. 多线程概述 人们在日常生活中,很多事情都是可以同时进行的。例如,一个人可以一边听音乐,一边打扫房间,可以一边吃饭,一边看电视。在使用计算机时,很多任务也是可以同时进行的。例如,可以一边…

VSCode 配置 C 语言编程环境

目录 一、下载 mingw64 二、配置环境变量 三、三个配置文件 四、格式化代码 1、安装插件 2、保存时自动格式化 3、左 { 不换行 上了两年大学,都还没花心思去搭建 C 语言编程环境,惭愧,惭愧。 一、下载 mingw64 mingw64 是著名的 C/C…

Leetcode130. 被围绕的区域

Every day a Leetcode 题目来源:130. 被围绕的区域 本题给定的矩阵中有三种元素: 字母 X;被字母 X 包围的字母 O;没有被字母 X 包围的字母 O。 本题要求将所有被字母 X 包围的字母 O都变为字母 X ,但很难判断哪些 …

KC705开发板——MGT IBERT测试记录

本文介绍使用KC705开发板进行MGT的IBERT测试。 KC705开发板 KC705开发板的图片如下图所示。FPGA芯片型号为XC7K325T-2FFG900C。 MGT MGT是 Multi-Gigabit Transceiver的缩写,是Multi-Gigabit Serializer/Deserializer (SERDES)的别称。MGT包含GTP、GTX、GTH、G…

点成案例丨比浊仪助力牙周炎诱发因素研究

牙周炎概述 牙周炎(Periodontitis)是一种炎症性疾病,其主要特征为牙周袋的形成及袋壁的炎症、牙槽骨吸收而导致牙龈与牙齿分离、牙齿逐渐松动或掉落等。牙周炎主要是由积聚在牙龈及其附近牙面、齿颈缘的牙菌斑内细菌所分泌的毒素令牙周组织发…

2023.9.1 简单认识 JVM

目录 JVM 内存划分 本地方法栈 虚拟机栈 程序计数器 堆区 元数据区 JVM 类加载机制 加载 验证 准备 解析 初始化 类被加载的几种情况(懒汉模式 ---> 只要被用到才会被加载) 双亲委派模型 JVM 内存划分 JVM 是一个应用程序,在…

QT C++ 基于TCP通信的网络聊天室

一、基本原理及流程 1&#xff09;知识回顾&#xff08;C语言中的TCP流程&#xff09; 2&#xff09;QT中的服务器端/客户端的操作流程 二、代码实现 1&#xff09;服务器 .ui .pro 在pro文件中添加network库 .h #ifndef WIDGET_H #define WIDGET_H#include <QWidget>…