【手把手带你入门】结构体

  • 结构体类型的声明
    • 结构的基础知识
    • 结构的声明
    • 结构成员的类型
  • 结构体变量的定义和初始化
  • 结构体成员访问
  • 结构体传参

小伙伴们大家好呀!又见面了~没错我就是每天努力码字努力爆肝的勤奋小码农。

看了我的文章,记得给我点个赞留下你的小脚印呀!

今天我们来讲讲结构体。

结构体类型的声明

结构的基础知识

首先我们先来认识一下结构的概念:

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

这里的结构指的就是结构体。

那么结构体是怎么来的呢?

现在的我们已经学了很多种类型,如int、char、short、float、double等等类型。

但是我们发现,这些类型都是互相孤立的。

但是我们的生活中有一些复杂对象(比如人、书)拥有很多的属性(比如年龄、性别;书名、定价等等),不能单一地用其中一种类型来描述,所以我们就给它定义一个新的类型,叫结构体类型。其中各种用来描述结构体类型的值,就称为成员变量

结构的声明

从上图中,我们也可以看出,结构体的声明主要由一下两部分组成:

注意:当我们声明了一个结构体类型,我们只是定义了一个类型,并没有创建变量,这时候它是不会占用内存空间的,只有当定义了变量之后,内存才会为这个变量开辟了空间。

这就像盖房子,我们首先要设计好一个图纸,但是只是设计了图纸,并没有把房子改出来,这时候是没有占用我们的土地的。这里的结构体就好似那张图纸,变量才是房子,只有当房子(变量)盖好了(创建了)才会占用土地(内存)面积(空间)。

我们看下面这声明的方式:

在声明类型的的同时用这种类型创建了p1和p2变量,这时候内存就为p1和p2开辟了空间。

当然,我们也可以像原来一样在main函数中创建一个该类型的变量p3。

他们都是结构体类型Point的变量,区别就是p1和p2是全局变量,放在内存中的静态区,而p3是局部变量,放在内存中的栈区上。

除了以上的两种类型声明外,下面这种声明方式也要注意:


虽然这种声明方式后面不能直接创建变量,但是我们后面创建变量的时候就不用每次都写struct Stu这么长了,只需要写Stu就行了,会显得更简洁。

结构成员的类型

从上面我们可以看到结构体的成员不仅可以是int、char、float类型,还可以是数组,其实它还可以是指针等等标量,甚至可以是其他的结构体。

这里我们可以把结构体理解为一个文件夹,这个文件夹内既可以放图片、文档、数据、音乐等等类型的东西,也可以放其他的文件夹。

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

有了结构体类型,那如何定义变量,其实很简单。

除了前面提到的直接在声明的同时定义结构体变量外,它的定义方式和普通的变量的定义方式一样,既可以在{ }内定义(作为局部变量),也可以直接在{ }外定义(作为全局变量)。


当然,在创建变量的同时,我们也可以对变量进行初始化。

但是注意,对于全局变量,当我们不对其进行不初始化时,编译器会将它默认初始化为0。

结构体成员访问

结构体成员的访问我们在初识C语言(下)和操作符详解中都进行过介绍。

那么这里我们再深入讲解一下结构体的嵌套访问

结构体传参

最后,当我们要对结构体进行传参的时候,我们又是如何传参的呢?

我们知道,函数的传参有两种形式:传值调用和传址调用

同样地结构体也可以进行传值和传址。

我们对比以上两种传参的方式,会发现传址调用会更好。

因为我们都知道,传址调用的时候,函数相当于是创建了一份临时变量,这份变量是对实参的临时拷贝。

那么如果我们创建的结构体变量比较大(比如上图代码中我们创建的成员变量中数组元素有100个),则我们调用函数的时候对实参的这份临时拷贝就比较大,这样的对系统的开销就比较大,会导致性能的下降。

但是如果我们进行的是传址调用,即把结构体的地址传过去,那么调用函数的时候,函数通过传过去的地址找到结构体,直接在这上面进行访问,就不会另外产生太大的开销。整体的效率都能得到提升。

所以,我们在对结构体进行传参的时候,最好传结构体的地址

时间过得辣么快~今天的文章就结束啦!

对于结构体,你是否又有了更多的认识呢?

如果你觉得文章还不错,记得一定一定要给博主点个赞再走噢!

博主还有很多内容没有分享出来呢!就等你的持续关注啦!

关注我,一起精进C语言~

本文相关代码已上传至Gitee啦!欢迎各位按需自取噢~
https://gitee.com/fang-qiuhui/my-code/blob/0307a1d25488c1c711bfc319f83b4b4141fade39/blog_2021_8_26_struct/blog_2021_8_26_struct.c

看到这类代码,别再说你不认识了!手把手带你认识初阶结构体(结构体类型的声明、初始化、成员访问与传参,全在这篇文章里)相关推荐

  1. 「收藏」关于机器学习的知识点,全在这篇文章里了

    尊重原创版权: https://www.qingtianxiaoshuo.com/hot/44432.html 更多内容参考: https://www.qingtianxiaoshuo.com/ 「收 ...

  2. 关于机器学习的知识点,全在这篇文章里了

    导读:作者用超过1.2万字的篇幅,总结了自己学习机器学习过程中遇到知识点."入门后,才知道机器学习的魅力与可怕."希望正在阅读本文的你,也能在机器学习上学有所成. 本文为「大数据」 ...

  3. 1万+字原创读书笔记,机器学习的知识点全在这篇文章里了

    作者 | 尘恋 来源 | 大数据(ID:hzdashuju) [导读]作者用超过1.2万字的篇幅,总结了自己学习机器学习过程中遇到知识点."入门后,才知道机器学习的魅力与可怕."希 ...

  4. 关于Java字符串的全部,就在这篇文章里了

    String 可以说是 Java 中最常见的数据类型,用来表示一串文本,它的使用频率非常高,为了小伙伴们着想,我怒肝了一周,把字符串能写的全都写了出来. 来看一下脑图吧,感受一下这份手册涉及到的知识点 ...

  5. JavaScript基础内功系列,这十篇文章里一定有你感兴趣的

    前端基础内功 这里总结了最经典.出镜率最高的一部分前端基础.希望能帮助自己和其他初级.中级前端同学打牢基础更进一步,加油! 前言 喜欢武侠或热衷武侠游戏的小伙伴门肯定了解,门派的弟子们在学习上乘武功大 ...

  6. txt转换epub如何转?你将在这篇文章里找到答案

    大家应该对txt文件不陌生吧,它作为众多电子书格式的一种,能够节省空间大小,便于在各个设备上浏览,但由于它只能存储文本内容,无法进行插入图片以及生成目录的操作,在阅读上给我们带来了一定的不便之处.而e ...

  7. 全网分析HTTP协议最全的一篇文章,程序员赶紧收藏

    本篇文章篇幅比较长,先来个思维导图预览一下. 一张图带你看完本篇文章 一.概述 1.计算机网络体系结构分层 计算机网络体系结构分层 2.TCP/IP 通信传输流 利用 TCP/IP 协议族进行网络通信 ...

  8. 你想了解的所有树结构,都收集在这篇文章里了

    前言: <算法 第四版>官网 树结点类: public class TreeNode {Integer key; // 键Integer val; // 值TreeNode left; / ...

  9. apache httpclient 工具类_Httpclient实现文件上传、文件下载看这篇文章就够了

    前言: 使用httpclient实现文件的上传下载,废话补不多说,直接上概念上代码. 1.相关概念: 1 HTTP HTTP 协议可能是现在 Internet 上使用得最多.最重要的协议了,越来越多的 ...

  10. 北京那些年轻人的秘密,都藏在这篇文章里

    这么大的北京,谁都有自己的秘密. 你可能永远都不会知道-- 平时在座位上似乎从来不动弹的开发小哥哥,业余时间是健身房的瑜伽教练: 隔壁team文文静静的小姐姐,周末是三里屯夜店的暖场女王: 坐在你旁边 ...

最新文章

  1. OpenDayLight Helium实验三 OpenDaylight二层转发机制实验
  2. Android的代码都得自己一个个敲一遍吗?
  3. python 生成列向量_python_mmdt:一种基于敏感哈希生成特征向量的python库(一)
  4. 桌面环境选择_Ubuntu 18.04 桌面环境初体验
  5. 用爬虫分析互联网大数据行业薪资情况
  6. CISCO路由器的备份与还原(2)
  7. 基于WordNet的英文同义词、近义词相似度评估及代码实现
  8. 以太网转DMX模块核心模块 支持ArtNet sACN DMX RDM
  9. 身份证上传识别测试点
  10. Oracle 高效学习的方法论
  11. 经典育儿书籍推荐目录
  12. Unity Shader 扇形进度条
  13. 用 Neon Intrinsics 优化 C 代码
  14. android 开发积累
  15. 动手学Android之六——布局初步(三)
  16. AppInventor 模拟器与AI伴侣 问题
  17. 纯粹CSS 绘制向下箭头
  18. 医院系统集成平台和临床数据中心CDR、大数据平台之间的关系?
  19. 公司网站制作需要多少钱?
  20. AVA中Iterator

热门文章

  1. asa 防火墙拦截了https_Cisco ASA防火墙的URL过滤控制
  2. 曾经的理发店小弟,现在是阿里P10技术大牛
  3. PostgreSQL的hook机制初步学习
  4. ES6---数组的spread扩展运算符
  5. 宋朝五子登科家族金榜进士涂大任后裔在松滋
  6. python+pygame之飞机大战-第一版源代码分析
  7. QGIS二次开发01---临时绘制图层实现
  8. 农业物联网系统功能特点
  9. 一枚前端UI组件库 KUI for React
  10. 泰坦尼克号幸存预测项目