初始结构体

简介: 初始结构体

结构体是什么?


结构体是用来描述复杂对象的一种 变量,结构体中的成员可以是多种不同类型的变量.


例如:结构的成员可以是 标量、 数组、 指针,甚至是其他 结构体.


例如:描述一名学生,一间房子……


这时我们就可以使用结构体来很好的表述这些对象.


一、结构体的声明


格式:


struct 结构体类型名字
{
  结构体中的成员
}(全局结构体变量);


🌰栗子


声明一个结构体类型,使其可以描述学生对象,学生信息包含,


姓名


年龄


性别


身高


学号

//结构体类型的声明
struct stu
{
  char name[20];//名字
  int age;//年龄
  char sex[5];//性别
  double stature;//身高
  char id[20];//学号
};


这段代码表示声明了一个结构体类型名为struct stu,成员就是不同类型的成员变量.


二、结构体变量的定义与初始化


当我们声明结构体的类型之后,接下来就要对结构体进行定义与初始化了.


1)定义与初始化 全局结构体变量:有两种方法


方法一:在声明结构体变量最后的分号前,可以定义和初始化全局结构体变量.


方法二:与其它全局变量一样,在主函数(main())外面定义即可.


提示一下:在操作符章节提到了结构体成员访问操作符(.)


#include <stdio.h>
 struct stu
{
  char name[20];//名字
  int age;//年龄
  char sex[5];//性别
  char id[20];//学号
}s3={"高启强",35,"男","2015666"};//此处的stu表示一个全局结构体变量
struct stu s4 = { "安欣",30,"男","2018888"};//定义全局结构体变量s4并初始化
int main()
{
  //局部变量的定义与初始化
  struct stu s1 = { "初阶牛",19,"男","2021666" };
  struct stu s2 = { "青鸟",19,"女","2021888" };
  //打印
  printf("%-8s %-2d %s %s \n", s1.name, s1.age, s1.sex, s1.id);
  printf("%-8s %-2d %s %s \n", s2.name, s2.age, s2.sex, s2.id);
  printf("%-8s %-2d %s %s \n", s3.name, s3.age, s3.sex, s3.id);
  printf("%-8s %-2d %s %s \n", s4.name, s4.age, s4.sex, s4.id);
  return 0;
}


上面有提到,结构体变量的成员可以是结构体,下面举例介绍嵌套结构体的定义与初始化


补充知识,当我们每次定义结构体变量时,结构体的类型名显得有点繁琐时,我们可以使用“typedef”关键字进行重命名.


结构体


#include <stdio.h>
typedef struct teacher ter;//重命名是结构体的类型更简便
typedef struct student stu;
struct teacher
{
  char name[20];//名字
  char subject[20];//科目
};//此处的stu表示一个全局结构体变量
struct student
{
  char name[20];//名字
  int age;//年龄
  char sex[5];//性别
  char id[20];//学号
  ter teacher;
};
stu s1 = { "老默",40,"男","2014555",{"张三","语文"} };//定义全局的结构体变量
int main()
{
  stu s2 = { "李响",38,"男","2016555",{"李四","英语"} };//定义局部的结构体变量
  //打印:
  printf("%-8s %-2d %s %s %s %s\n", s1.name, s1.age, s1.sex, s1.id, s1.teacher.name, s1.teacher.subject);
  printf("%-8s %-2d %s %s %s %s\n", s2.name, s2.age, s2.sex, s2.id, s2.teacher.name, s2.teacher.subject);
  return 0;
}


三、结构体传参


当我们将结构体变量作为函数参数进行传参的 时候,应该怎样接收并使用的呢?


我们可能会觉得上面的打印显得较为繁琐,我们不妨将打印封装为一个函数,打印时直接调用该函数呢?


🌰栗子:结构体打印函数


#include <stdio.h>
typedef struct teacher ter;//重命名是结构体的类型更简便
typedef struct student stu;
struct teacher
{
  char name[20];//名字
  char subject[20];//科目
};//此处的stu表示一个全局结构体变量
struct student
{
  char name[20];//名字
  int age;//年龄
  char sex[5];//性别
  char id[20];//学号
  ter teacher;
};
stu s1 = { "老默",40,"男","2014555",{"张三","语文"} };//定义全局的结构体变量
void print1(stu s)//传值调用
{
  printf("%-8s %-2d %s %s %s %s\n", s.name, s.age, s.sex, s.id, s.teacher.name, s.teacher.subject);
}
void print2(stu* s)//传址调用
{
  printf("%-8s %-2d %s %s %s %s\n", (*s).name, (*s).age, (*s).sex, (*s).id, (*s).teacher.name, (*s).teacher.subject);
  //上行代码可简化为下一行代码,      (s).等价于->
  //printf("%-8s %-2d %s %s %s %s\n", s->name,  s->age,  s->sex,  s->id,  s->teacher.name,  s->teacher.subject);
}
int main()
{
  stu s2 = { "李响",38,"男","2016555",{"李四","英语"} };//定义局部的结构体变量
  //打印:
  print1(s1);//传值调用
  print2(&s2);//传址调用
  return 0;
}


问题:试着想一想,print1函数与print2函数谁更优呢?


答案:print2,因为传值调用会向内存申请空间,无论是时间还是空间上都要耗费,再加上结构体内存大小一般都比较大(在后续会将结构体所占的内存计算),所以传址调用更优.


这篇文章主要是初步了解结构体,知道结构体是什么,如何使用结构体描述对象,结构体的简单传参


结构体的所占内存大小计算稍微复杂一些,后续会单独讲.


目录
相关文章
|
JSON 人工智能 自然语言处理
Prompt进阶系列4:LangGPT(构建高性能Prompt实践指南)--结构化Prompt
Prompt进阶系列4:LangGPT(构建高性能Prompt实践指南)--结构化Prompt
|
7月前
|
弹性计算 运维 小程序
阿里云特惠云服务器选购:2核2G抢购价38元起,2核4G199元,配置使用场景对比与选择指南
2026年阿里云推出特价云服务器,2核2G与2核4G配置满足不同用户需求。2核2G配置中,轻量应用服务器以38元/年吸引新用户,适合个人网站等;ECS经济型e实例则以99元/年提供稳定服务,新老用户同享。2核4G配置方面,轻量应用服务器提供9.9元/月或199元/年的灵活选择,ECS通用算力型u1实例则以199元/年面向企业用户,提供均衡性能。活动截止至2027年3月31日,用户可根据需求选择。
|
11月前
|
机器学习/深度学习 人工智能 前端开发
构建AI智能体:七十、小树成林,聚沙成塔:随机森林与大模型的协同进化
随机森林是一种基于决策树的集成学习算法,通过构建多棵决策树并结合它们的预测结果来提高准确性和稳定性。其核心思想包括两个随机性:Bootstrap采样(每棵树使用不同的训练子集)和特征随机选择(每棵树分裂时只考虑部分特征)。这种方法能有效处理大规模高维数据,避免过拟合,并评估特征重要性。随机森林的超参数如树的数量、最大深度等可通过网格搜索优化。该算法兼具强大预测能力和工程化优势,是机器学习中的常用基础模型。
1467 165
|
11月前
|
存储 分布式计算 数据可视化
Pandas处理大规模数据:分块读取与内存优化实战指南
本文揭秘Pandas处理大规模数据的实战技巧,从分块读取、内存优化到高效存储,结合真实案例教你如何在8GB内存环境下流畅处理50GB数据,彻底告别“MemoryError”。
841 0
|
11月前
|
前端开发 安全 Java
集成Knife4j
knife4j是Java MVC框架集成Swagger的增强工具,前身swagger-bootstrap-ui,旨在提供更美观、易用的API文档界面。轻量如匕首,功能强大,支持全局参数设置、离线文档下载、友好测试界面。集成简便,通过引入starter依赖并访问/doc.html即可使用,助力前后端高效协作,提升接口调试与维护体验。
|
监控 负载均衡 网络协议
OSPF的性能优化策略
OSPF的性能优化策略
804 3
|
算法 异构计算 Python
【图像重建】使用FDK的三维谢普洛根幻影重建(Matlab代码实现)
【图像重建】使用FDK的三维谢普洛根幻影重建(Matlab代码实现)
469 6
|
数据采集 监控 API
亚马逊:对接竞品监控API实时跟踪价格变动,调整定价策略
在电商竞争中,亚马逊通过对接竞品监控API,实现价格实时采集与分析,动态调整定价策略。本文详解其技术实现、商业价值及挑战,展现数据驱动下的智能定价如何提升竞争力与利润。
1169 0
如何优雅上线、下线?原来 大厂应用 是这样 优雅发布的!
如何优雅上线、下线?原来 大厂应用 是这样 优雅发布的!
如何优雅上线、下线?原来 大厂应用 是这样 优雅发布的!
|
前端开发 Java 数据库连接
Java后端开发-使用springboot进行Mybatis连接数据库步骤
本文介绍了使用Java和IDEA进行数据库操作的详细步骤,涵盖从数据库准备到测试类编写及运行的全过程。主要内容包括: 1. **数据库准备**:创建数据库和表。 2. **查询数据库**:验证数据库是否可用。 3. **IDEA代码配置**:构建实体类并配置数据库连接。 4. **测试类编写**:编写并运行测试类以确保一切正常。
1028 2