【C语言航路】第七站:结构体初阶

news/2024/12/29 16:34:44/

目录

一、结构体的声明

1.结构的基础知识

2.结构的声明

3.结构体成员的类型

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

二、结构体成员的访问

 三、结构体传参

总结


一、结构体的声明

1.结构的基础知识

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

2.结构的声明

struct tag

{

        member-list;

}variable-list;

其中,tag是结构体标签,是可以根据需求进行更改的

struct tag是结构体类型

member-list是结构体成员(成员列表)

variable-list是结构体变量

如下所示就是一个结构体的声明,但是还没有创建变量。

struct Stu
{//结构体成员char name[20];int age;char sex[10];float sorce;
};

下面代码就是结构体的创建变量的过程了

#include<stdio.h>
struct Stu
{//结构体成员char name[20];int age;char sex[10];float sorce;
}s4,s5;//s4,s5也是结构体变量
int main()
{//创建结构体变量struct Stu s1, s2, s3;return 0;
}

当然这两种定义结构体的变量是有一点区别的,s1,s2,s3都是局部的结构体变量,而s4,s5都是全局的。

当然我们也可以将s1,s2,s3,这些按照他们的那种方式定义在主函数外面,这样他们也就是全局变量了

结构体也可以在主函数内部进行声明,不过一般都不会这样使用的

#include<stdio.h>
int main()
{struct Stu{//结构体成员char name[20];int age;char sex[10];float sorce;};//创建结构体变量struct Stu s1, s2, s3;return 0;
}

3.结构体成员的类型

结构体成员的类型可以是标量,数组,指针,甚至是其他结构体

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

我们看如下代码:

#include<stdio.h>
struct Stu
{//结构体成员char name[20];int age;char sex[10];float sorce;
};
int main()
{struct Stu s1 = { "zhangsan",18,"nan",91.5f };struct Stu s2 = { "wangwu",19,"秘密",60.5f };printf("%s %d %s %.1f\n", s1.name, s1.age, s1.sex, s1.sorce);printf("%s %d %s %.1f\n", s2.name, s2.age, s2.sex, s2.sorce);return 0;
}

这段代码就定义了一个结构体变量,然后并对其进行赋值初始化,然后打印出这些信息。运行结果如下

 当然,我们在前文中提到过,结构体里面的成员可以是结构体。我们来看下面的代码

#include<stdio.h>
struct S
{int a;int b;
};
struct P
{double c;struct S s;float d;
};
int main()
{struct P p = { 3.14,{5,6},4.58f };printf("%lf,%d,%d,%f", p.c, p.s.a, p.s.b, p.d);return 0;
}

这段代码就是在结构体中嵌套了一个结构体,我们进行初始化的时候,就要对里面在嵌套一层括号了,然后打印的时候,先使用.操作符找到里面的那个结构体,然后在使用.操作符,就能找到结构体里面的结构体的成员了.

二、结构体成员的访问

其实在上面我们已经提及了一种结构体成员的访问方式,就是使用.操作符

如下所示,我们可以通过一个函数,将p这个结构体变量给传过去,然后通过函数来打印。但是需要注意的是,这里是传值调用。

#include<stdio.h>
struct S
{int a;char b;
};
struct P
{double c;struct S s;float d;
};
void Print1(struct P ps)
{printf("%lf,%d,%c,%f\n", ps.c, ps.s.a, ps.s.b, ps.d);
}
int main()
{struct P p = { 3.14,{5,'b'},4.58f};//printf("%lf,%d,%c,%f", p.c, p.s.a, p.s.b, p.d);Print1(p);return 0;
}

当然,也可以传入地址过去

#include<stdio.h>
struct S
{int a;char b;
};
struct P
{double c;struct S s;float d;
};
void Print1(struct P ps)
{printf("%lf,%d,%c,%f\n", ps.c, ps.s.a, ps.s.b, ps.d);
}
void Print2(struct P* ps)
{//结构体变量.成员名printf("%lf,%d,%c,%f\n", (*ps).c, (*ps).s.a, (*ps).s.b, (*ps).d);//结构体指针->成员名printf("%lf,%d,%c,%f\n", ps->c,ps->s.a, ps->s.b, ps->d);
}
int main()
{struct P p = { 3.14,{5,'b'},4.58f};//printf("%lf,%d,%c,%f", p.c, p.s.a, p.s.b, p.d);Print1(p);Print2(&p);return 0; 
}

这样的话,我们打印就有两种方式了,一种是先解引用然后使用.操作符,另外一种就是使用结构体->结构体成员

运行结果为

 三、结构体传参

关于结构体的传参其实已经在上面有所涉及,这里我们来提出一个问题,上面的代码中,print1好还是print2好呢?

其实答案是print2,因为函数传参的时候,参数是需要压栈的。 如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的下降。


总结

本小节讲述了结构体的声明和定义,结构体的访问以及结构体传参这些知识,当然这些知识还是不够的,因此我们这节课才叫做结构体初阶。后续我们结构体还会更加详细的展开讲解


http://www.ppmy.cn/news/1859.html

相关文章

PyG (PyTorch Geometric) 异质图神经网络HGNN

诸神缄默不语-个人CSDN博文目录 PyTorch Geometric (PyG) 包文档与官方代码示例学习笔记&#xff08;持续更新ing…&#xff09; 本文介绍使用PyG实现异质图神经网络&#xff08;HGNN&#xff09;的相关操作。 本文主要参考PyG文档异质图部分&#xff1a;Heterogeneous Graph…

Redis配置、持久化以及相命令

Redis 什么是Redis Redis&#xff08;远程字典服务器&#xff09;是一个开源的、使用C语言编写的NoSQL数据库 Redis 基于内存运行并支持持久化&#xff0c;采用key-value&#xff08;键值对&#xff09;的存储形式&#xff0c;是目前分布式架构中不可或缺的一环。 Redis服务…

[附源码]Python计算机毕业设计SSM健身房管理系统 (程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

磁环选型攻略及EMC整改技巧

磁环选型攻略及EMC整改技巧 今天跟大家分享一下磁环选型及应用相关的知识&#xff0c;希望对你有帮助。 本文将从以下四个方面对磁环进行阐述。 一、磁环的应用场景 首先我们来看几张图片 图1 显示屏VGA线 图2 适配器连接线 图3 USB通信线 这三根线都是我们生活中常见的供电…

HTML5期末考核大作业:基于Html+Css+javascript的网页制作(化妆品公司网站制作)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

20221205英语学习

今日新词&#xff1a; abort v.中止, 流产, 放弃, 堕胎 motor adj.有引擎的, 由发动机推动的, 机动车的, 汽车的 flag n.旗, 标志旗, 菖蒲, 旗帜&#xff08;指某国家或组织及其信仰和价值观&#xff09; August n.八月 division n.&#xff08;主要&#xff09;部门&…

试剂盒和示踪剂—艾美捷FLIVO探针活体凋亡检测分析

针对FLIVO(FLuorescence in vIVO)探针的研究&#xff0c;本篇文章推荐艾美捷ImmunoChemistry&#xff08;ICT&#xff09;FLIVO探针系列的&#xff1a;天冬氨酸蛋白酶(Caspases)活性检测试剂盒&#xff0c;及 FLIVO示踪剂&#xff0c;主要用于细胞凋亡活体检测&#xff0c;助力…

数据结构和算法之《栈》详解

标题&#xff1a;栈的思路及代码实现 作者&#xff1a;Ggggggtm 寄语&#xff1a;与其忙着诉苦&#xff0c;不如低头赶路&#xff0c;奋路前行&#xff0c;终将遇到一番好风景 文章目录&#xff1a; 一、栈的概念及结构 1、1 栈的概念 1、2 栈的结构 二、栈的思路及代码实现详解…