结构体详解(一)

简介: 结构体详解

前言


在我们日常时候中有很多东西都不能用简单的用一个整型或一个字符串来表示的,比如,一个人有体重、身高、姓名、性别、年龄等等,再比如一本书,有书名、价格、作者、出版社等等,描述这些复杂事物我们就可以用结构体来解决。(以下代码均在VS2019,X86下运行)


结构体的声明


结构的基础知识


结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。


结构体的声明


例如描述一个学生:


struct Stu     //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];
}s1,s2;        //声明一个结构体并定义两个该结构体类型变量,s1、s2是全局变量
int main()
{
    struct Stu s3;  //s3是局部变量
    struct Stu s4;  //s4是局部变量
    return 0;
}


特殊的声明


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

例如:


//匿名结构体类型,不知道结构体的具体类型
struct
{
  int a;
  char b;
  float c;
}x;
struct
{
  int a;
  char b;
  float c;
}a[20], * p;


上面的两个结构体在声明的时候省略掉了结构体标签。

那么问题来了,在上面代码的基础上,下面的代码合法吗?


p = &x;


警告:

编译器不知道结构体的具体类型,所以会把上面的两个声明当成完全不同的两个类型。

所以是非法的。


注意:匿名结构体要定义变量只能跟在结构体后面定义。


struct
{
  int a;
  char b;
  float c;
}x;      //可以
int main()
{
  struct y;   //不行
  return 0;
}


结构体的自引用


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


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

这样定义可以吗?

如果可行,那sizeof(struct Node)为多大?


这样不行,我们看到 struct Node 类型的结构体里定义了一个结构体 next,该结构体类型里包含了一个 int 类型和一个结构体类型,这个结构体里又有结构体……

这样无限套娃,没有停止,占用的空间无限大,这是不行的。


那我们如何来正确的自引用呢?


struct Nod
{
  int data;
  struct Nod* next;  //定义一个该结构体的指针,解引用即可得到该结构体
};       
int main()
{
  struct Nod n;    //每次定义一个结构体都要写 struct ,有没有什么办法可以不用写呢?
  return 0;
}


我们可以这样写:


typedef struct Nod 
{
  int data;
  struct Nod* next;  
}Node;      //对前面的结构体重命名,取名为 Node
int main()
{
  Node n;   
  return 0;
}


我们再来看看下面代码:


typedef struct Nod
{
  int data;
  Node* next;   //在结构体内部用Node不行,因为在结构体内部时还未重命名为 Node
}Node;


typedef struct Nod
{
  int data;
  struct Nod* next;    //应该这样写
}Node;


结构体变量的定义和初始化


有了结构体类型,那如何定义变量呢?


struct Point
{
  int x;
  int y;
}p1;       //声明类型的同时定义变量 p1
struct Point p2;   //定义结构体变量 p2
struct Point p3 = { 2, 4 };    //定义变量的同时赋初值。


struct Stu   //类型声明
{
  char name[15];  //名字
  int age;   //年龄
};
struct Stu s = { "zhangsan", 20 };  //初始化


struct Node
{
  int data;
  struct Point p;
  struct Node* next;
}n1 = { 10, {4,5}, NULL }; //结构体嵌套初始化
struct Node n2 = { 20, {5, 6}, NULL };//结构体嵌套初始化

相关文章
|
SQL Python
基于 sqli-labs-Pass08,利用Python 实现 SQL盲注(含二分法)
基于 sqli-labs-Pass08,利用Python 实现 SQL盲注(含二分法)
|
存储 大数据 测试技术
用于大数据分析的数据存储格式:Parquet、Avro 和 ORC 的性能和成本影响
在大数据环境中,数据存储格式直接影响查询性能和成本。本文探讨了 Parquet、Avro 和 ORC 三种格式在 Google Cloud Platform (GCP) 上的表现。Parquet 和 ORC 作为列式存储格式,在压缩和读取效率方面表现优异,尤其适合分析工作负载;Avro 则适用于需要快速写入和架构演化的场景。通过对不同查询类型(如 SELECT、过滤、聚合和联接)的基准测试,本文提供了在各种使用案例中选择最优存储格式的建议。研究结果显示,Parquet 和 ORC 在读取密集型任务中更高效,而 Avro 更适合写入密集型任务。正确选择存储格式有助于显著降低成本并提升查询性能。
1252 1
用于大数据分析的数据存储格式:Parquet、Avro 和 ORC 的性能和成本影响
|
机器学习/深度学习 数据采集 TensorFlow
使用Python实现深度学习模型:智能水资源管理与保护
【8月更文挑战第6天】 使用Python实现深度学习模型:智能水资源管理与保护
261 0
|
12月前
|
自然语言处理 Linux iOS开发
【推荐】博客创作必备工具✨
为了帮助博主们更高效地创作和发布内容,本文汇总了从 Markdown 编辑器、截图工具、绘图工具到发布工具的写博客必备工具。这些工具涵盖了文本编辑、图片处理、图表绘制、GIF 录制和多平台发布等多个方面。无论你是初学者还是经验丰富的创作者,这些工具都会为你提供全方位的支持,助力你轻松高效地完成博客创作和发布。
434 64
|
9月前
|
安全 大数据 Linux
云上体验最佳的服务器操作系统 - Alibaba Cloud Linux | 飞天技术沙龙-CentOS 迁移替换专场
本次方案的主题是云上体验最佳的服务器操作系统 - Alibaba Cloud Linux ,从 Alibaba Cloud Linux 的产生背景、产品优势以及云上用户使用它享受的技术红利等方面详细进行了介绍。同时,通过国内某社交平台、某快递企业、某手机客户大数据业务 3 大案例,成功助力客户实现弹性扩容能力提升、性能提升、降本增效。 1. 背景介绍 2. 产品介绍 3. 案例分享
192 1
|
存储 Java 程序员
昵称重复怎么办?一招教你轻松搞定!
本文介绍了如何使用布隆过滤器高效管理用户昵称重复问题。在互联网项目中,确保昵称唯一性至关重要,可避免混淆、增强安全性和保持数据一致性。布隆过滤器通过哈希函数和位数组实现快速查询,具有低内存占用和高速查询的优点。文中详细解释了其工作原理,并提供了Java代码示例,帮助读者理解和应用这一技术,提升项目性能。
291 17
昵称重复怎么办?一招教你轻松搞定!
|
11月前
|
消息中间件 数据采集 运维
一份运维监控的终极秘籍!监控不到位,宕机两行泪
【10月更文挑战第25天】监控指标的采集分为基础监控和业务监控。基础监控涉及CPU、内存、磁盘等硬件和网络信息,而业务监控则关注服务运行状态。常见的监控数据采集方法包括日志、JMX、REST、OpenMetrics等。Google SRE提出的四个黄金指标——错误、延迟、流量和饱和度,为监控提供了重要指导。错误监控关注系统和业务错误;延迟监控关注服务响应时间;流量监控关注系统和服务的访问量;饱和度监控关注服务利用率。这些指标有助于及时发现和定位故障。
829 1
|
存储 数据可视化 大数据
从零到一建设数据中台 - 应用场景及实施路径
从零到一建设数据中台 - 应用场景及实施路径
549 0
|
消息中间件 监控 Java
Java一分钟之-Kafka:分布式消息队列
【6月更文挑战第11天】Apache Kafka是一款高性能的消息队列,适用于大数据处理和实时流处理,以发布/订阅模型和分布式设计处理大规模数据流。本文介绍了Kafka基础,包括生产者、消费者、主题和代理,以及常见问题:分区选择、偏移量管理和监控不足。通过Java代码示例展示了如何创建生产者和消费者。理解并妥善处理这些问题,结合有效的监控和配置优化,是充分发挥Kafka潜力的关键。
214 0
|
关系型数据库 MySQL 数据安全/隐私保护
MySQL8.0绿色版本——最纯净的安装体验(免去卸载不掉只能重做系统的‘囧‘境)
MySQL8.0绿色版本——最纯净的安装体验(免去卸载不掉只能重做系统的‘囧‘境)
1535 0