初始结构体

简介: 初始结构体

结构体是什么?


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


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


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


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


一、结构体的声明


格式:


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 数据格式 内存技术
给layui的upload加了文件大小限制
/*! @Title: layui.upload 单文件上传 - 全浏览器兼容版 @Author: 贤心 @License:MIT */ layui.
6552 0
|
10月前
|
人工智能 搜索推荐
基于 PAI-ArtLab 使用 ComfyUI 生成人像写真
本实验基于SDXL、InstantID技术,解决AI人像摄影中人物面部特征在风格迁移与图像放大后无法高度还原的问题。内置6种儿童风格提示词模板及提示词翻译模块,支持中文书写相关图像提示词测试个性化风格。需登录阿里云PAI ArtLab平台操作,领取免费试用资源后,通过ComfyUI(专享版)拉起服务并加载工作流,上传图片、选择草图、更换连线等步骤生成不同风格成果。还提供自定义风格模块和常见问题解答,方便用户解锁更多玩法。
|
数据可视化 前端开发
Twaver-HTML5基础学习(39)鹰眼可视化视图组件(OverView)
本文介绍了如何在Twaver-HTML5中使用鹰眼(Overview)可视化视图组件,它作为Network的缩略图,允许用户通过缩略图导航Network,支持单击、双击和框选操作来控制Network视图。
326 5
Twaver-HTML5基础学习(39)鹰眼可视化视图组件(OverView)
|
消息中间件 Kafka 流计算
Flink(十一)【状态管理】(3)
Flink(十一)【状态管理】
|
Kubernetes Cloud Native Go
云原生之旅:构建和部署一个简单的Go应用程序
【8月更文挑战第31天】在本文中,我们将探索如何利用云原生技术构建和部署一个Go语言编写的简单Web应用。通过实际操作示例,我们不仅能够了解云原生的基本概念,还能学习到如何在Kubernetes集群上运行和管理容器化应用。文章将引导读者从零开始,逐步搭建起自己的云原生环境,并实现代码的容器化与自动化部署,最终达到持续交付的目的。
|
jenkins Java 持续交付
jenkins学习笔记之十九:Docker安装jenkins master及动、静态配置slave
jenkins学习笔记之十九:Docker安装jenkins master及动、静态配置slave
|
网络协议
FTP(文件传送协议)和TELNET(远程终端协议)
FTP(文件传送协议)和TELNET(远程终端协议)
582 1
|
C语言 C++
指针变量作为函数参数
指针变量作为函数参数
302 1
|
机器学习/深度学习 数据采集 人工智能
大模型开发:解释特征工程的重要性以及你如何进行特征选择。
特征工程对机器学习和深度学习至关重要,涉及数据清洗、转换和特征选择,以提升模型预测和泛化能力。它能提高数据质量、浓缩信息、优化模型性能及增强解释性。特征选择是关键步骤,包括过滤法、递归特征消除、嵌入式(如L1正则化)、包裹式和基于模型的方法。此过程通常迭代进行,结合多种工具和业务知识,并可通过自动化技术(如AutoML)简化。
1063 0
|
安全 CDN
三天完成企业官网ICP备案与公安备案-详细流程
三天完成企业官网ICP备案与公安备案-详细流程
626 0
三天完成企业官网ICP备案与公安备案-详细流程

热门文章

最新文章