结构体的简单介绍(2)

news2024/11/28 6:28:40

目录

结构体的特殊声明

结构体的自引用


结构体的特殊声明

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

比如:

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.coloradmin.cn/o/976057.html

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

相关文章

Qt CMake 中国象棋程序实现

前驱课程 C自学精简实践教程 目录(必读) C数据结构与算法实现(目录) Qt 入门实战教程(目录) 项目初衷 为学习 Qt 的人提供一个合适的有一定难度的综合型练习项目。 在学会写代码之前,先看别人怎么写的代码。深入…

计算机竞赛 基于深度学习的人脸性别年龄识别 - 图像识别 opencv

文章目录 0 前言1 课题描述2 实现效果3 算法实现原理3.1 数据集3.2 深度学习识别算法3.3 特征提取主干网络3.4 总体实现流程 4 具体实现4.1 预训练数据格式4.2 部分实现代码 5 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 毕业设计…

基于Java+SpringBoot+Vue前后端分离论坛系统设计和实现

博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…

2000-2022年上市公司融资约束指数(KZ、SA、FC和WW指数)(含原始数据、方法说明和计算结果)

2000-2022年上市公司融资约束指数(KZ、SA和WW指数)(含原始数据和计算结果) 1、时间跨度:2000-2022年 2、区域范围:沪深A股上市公司 3、指标说明: 证券代码、证券简称、统计截止日期、是否剔…

SSD202D-编译固件重启无法进入kernel

今天打包发现我的固件一直重启,我一直以为是没升级好; 然后根据log发现在进入kernel的时候挂掉了 汇编都暴出来了,这就很焦灼 我查看对比正常启动的log,boot一模一样,等了很久之后会有概率进系统 我要查看问题在哪里,搞得焦头烂额 1.我用以前的固件确认一下问题是不是在板…

高忆管理:证券账户国债逆回购怎么操作?

国债逆回购的本质就是一种短期贷款,个人经过国债回购商场把自己的资金借出去,取得固定的利息收益,那么,证券账户国债逆回购怎样操作?怎样在股票账户上买国债逆回购?下面高忆管理为我们准备了相关内容&#…

Editplus打开当前文件所在的文件夹

一个小技巧:Editplus打开当前文件所在的文件夹,备忘记录一下。 1、打开目录窗口 AltShift3,打开目录窗口(Directory Window),这是开关键,再按一次会关闭目录窗口。 2、打开文件夹 在“目录窗…

git代码撤销回滚只看这一篇就足够了!

1. 代码撤销 目前大家都在使用git,在项目开发中,总会遇到提交的代码有问题,想要撤销回滚的操作,关于撤销回滚代码单独给大家介绍一下。   正常的提交代码如果要提交到远程仓库有下边3步命令: git add . ------------…

软件测试/测试开发丨Web自动化 测试用例流程设计

点此获取更多相关资料 本文为霍格沃兹测试开发学社学员学习笔记分享 原文链接:https://ceshiren.com/t/topic/27173 一、测试用例通用结构回顾 1.1、现有测试用例存在的问题 可维护性差可读性差稳定性差 1.2、用例结构设计 测试用例的编排测试用例的项目结构 1…

RobotFramework自动化测试框架系列学习-----(一)简介、搭建、运行

一、简介 基于Python的关键字驱动的自动化框架。 1.基于Python:就是由python语言开发的这个框架。 2.关键字驱动:关键字驱动测试又称为表格驱动测试,是自动化测试的一种方法,是数据测试的一种改进方法。关键字驱动主要包括测试步骤…

利用vba处理Excel表格数据实现键值转化,适用于将编码转化成对应的文本

最近遇到了一个甲方需要提供系统登录的用户名单和对应的角色权限内容。无奈直接从数据库导出的数据对应的都是编码,没有转成中文,想着偷个懒能不能直接用Excel直接转,网上看了一下有修改单元格格式的,但需要编码是2到3个。多的就用…

HyperDock 1.8.0.10(Dock优化工具)

HyperDock 是一款为 macOS 设计的实用工具,它提供了许多方便快捷的功能,使您能够更高效地管理和操作应用程序窗口。 首先,HyperDock 提供了类似于 Windows 7 的任务栏预览功能。当您将鼠标悬停在应用程序图标上时,会显示该应用程…

C++入门基础知识总结(超详细思维导图)

开门见山 思维导图奉上 引用和指针的区别宏宏的优缺点 C中替代宏C和C的区别 !!! 详细部分参考该博客:从C快速入门C (命名空间、引用、函数重载) !!! 引用和指针的区别 ● 引用就…

cin、cin.getline()、getline()的用法【C++】

一、cin>> 用法1&#xff1a;输入一个数字或字符 #include <iostream> using namespace std; int main () {int a,b;cin>>a>>b;cout<<ab<<endl;return 0; } 用法2&#xff1a;接收一个字符串&#xff0c;遇“空格”、“TAB”、“回车”…

气导耳机有哪些品牌?市面上气传导耳机哪家好?

​随着人们对运动健康的重视&#xff0c;越来越多的人开始关注运动时佩戴的耳机。然而&#xff0c;传统的耳机在运动时往往会受到限制&#xff0c;而气传导耳机则可以避免这些问题&#xff0c;为用户带来更加舒适和便捷的使用体验。今天就来展开说说&#xff0c;市面上气传导耳…

【程序员必知必会3】ClickHouse和Hive究竟哪些区别

ClickHouse和Hive究竟哪些区别 ClickHouse和Hive都是用于大数据处理和分析的分布式存储和计算系统&#xff0c;但它们之间存在一些区别&#xff1a; 架构&#xff1a;ClickHouse采用列式存储和向量化执行引擎&#xff0c;可以实现亚秒级别的数据查询。而Hive采用基于Hadoop的数…

设置Linux CentOS7桥接模式连网

在虚拟机上安装centos7系统后&#xff0c;首要任务就是设置网络。 我们在文章《设置linux centos7连接网络》中讨论了如何设置NAT模式连网。本文讨论如何在设置好NAT模式后&#xff0c;调换为桥接模式。 仍采用图形化方式设置方法。 一、查看物理机网络 把虚拟机设置为桥接…

JDK源码解析-HashMap面试题

1. HashMap类 * HashMap底层数据结构(为什么引入红黑树、存储数据的过程、哈希碰撞相关问题)* HashMap成员变量(初始化容量是多少、负载因子、数组长度为什么是2的n次幂)* HashMap扩容机制(什么时候需要扩容&#xff1f; 怎么进行扩容&#xff1f;)* JDK7 与 Jdk8比较&#xff…

检索与毒害 —— 对抗人工智能供应链攻击

作者&#xff1a;DAVE ERICKSON 在这篇文章中&#xff0c;了解人工智能大语言模型的供应链漏洞&#xff0c;以及如何利用搜索引擎的人工智能检索技术来对抗人工智能的错误信息和故意篡改。 虽然对于人工智能研究人员来说可能是新鲜事&#xff0c;但供应链攻击对于网络安全世界…

如何批量生成并分割m3u8视频,轻松提升您的视频制作效率!

亲爱的视频制作爱好者&#xff0c;您是否曾经为如何高效地批量生成和分割m3u8视频而烦恼&#xff1f;今天&#xff0c;我们为您带来了一款神奇的软件&#xff0c;让您的视频剪辑工作变得轻松无比&#xff01; 第一步&#xff0c;进入“媒体梦工厂”在主界面中有八个板块&#…