当前位置: 首页 > ds >正文

C语言中关于普通变量和指针变量、结构体包含子结构体或包含结构体指针的一些思考

《2》普通变量是静态的,指针变量是动态的。这里的静态和动态是指能否修改。

试想一下在函数传参的时候复制一个普通变量和一个指针类型变量的值。普通变量赋值后,将变量的值复制给参数,在函数内部是无法对这个变量的值进行修改的,而指针变量就可以在函数内部对指向的真实变量进行修改。(从这里看出指针变量的灵活性,特点,以及威力)

《2》、C语言中大量存在赋值“=”操作,效率最高的就是普通变量赋值或者指针变量这种1字节、2字节、4字节赋值操作,C语言非常擅长这种小变量赋值操作以及指针或者指针变量解引用操作,而且这些操作效率非常高。如果直接复制整个结构体,效率非常低,这也是为什么传参中使用结构体变量指针的原因,反正后面可以使用函数体内部使用结构体指针解引用的方式访问成员。

《3》结构体内部使用结构体指针的好处以及必须使用结构体指针的相关情况:

(1)当使用堆内存的时候,也就是使用malloc()、free()相关函数动态申请释放内存的时候,必须要使用结构体指针。而且需要使用的时候再申请内存,使用完了可以释放内存,非常节约内存。

(2)定义一个结构体指针,它存储的或者被写入的是某一个结构体的地址,这个被指向的结构体编译器可以在存储在其他内存地方,有点像碎片内存,这样指向的内存就无需和当前结构体在一起,有利于编译器对内存碎片化操作。

(3)使用结构体指针可以节省内存大小,我们都知道指针变量也就是占4字节内存空间,当我们定义多个结构体变量的时候,使用结构体指针更节省内存,而且效率更好,因为定义变量就是编译器分配内存,内存格子越小,效率越高。

(4)结构体内部包含子结构体,那么这两个结构体在空间上必须挨在一起,时间上(生命周期)保持一致,无法提前释放,也就是说在空间和时间上两者会一直存在,无法改变。

(5)从继承角度考虑,结构体内部使用结构体指针也更有优势,子结构体只需定义一个父结构体的指针变量就相当于继承了父结构体的相关特性(数据以及函数指针)。否则如果包含父结构体整体,随着继承层数的增多,占用内存越来越大,效率越来越低,后面会存在大量空闲的内存,而且也不符合自然规律(只有一个父亲,一个儿子,不能随着继承层数增多,儿子、父亲越来越多)。

总之结构体内部包含子结构体,在空间和时间上绑定在了一起,而且占用内存大,生命周期长,效率地下,容易造成内存浪费,尽量少使用。

结构体内部包含结构体指针,空间上占用内存小,可以按需分配,生命周期也可以程序员自我把握,执行效率高(创建过程、复制过程),而且动态灵活(可以修改指向的结构体成员)。

http://www.xdnf.cn/news/17847.html

相关文章:

  • windows单机单卡+CIFAR-10数据集+Docker模拟训练
  • 一键设置 NTP 时区的脚本(亲测,适用于部署 K8S 的前置环境)
  • http网页部署
  • 【从零开始java学习|第四篇】IntelliJ IDEA 入门指南
  • C++方向知识汇总(四)
  • Ansible 自动化介绍
  • 如何在idea中导入外来文件
  • 基于大数据的在线教育评估系统 Python+Django+Vue.js
  • C++中template、 implicit 、explicit关键字详解
  • Rust 项目编译故障排查:从 ‘onnxruntime‘ 链接失败到 ‘#![feature]‘ 工具链不兼容错误
  • Rust:构造函数 new() 如何进行错误处理?
  • Xshell远程连接Ubuntu 24.04.2 LTS虚拟机
  • HCIP项目之OSPF综合实验
  • [Robotics_py] 路径规划算法 | 启发式函数 | A*算法
  • Linux系统编程Day13 -- 程序地址空间
  • git config的配置全局或局部仓库的参数: local, global, system
  • MaxKB+合合信息TextIn:通过API实现PDF扫描件的文档审核
  • 如何构建PHP表单页面及验证相关原理(PHP基础)
  • 自动驾驶决策算法 —— 有限状态机 FSM
  • Android 引导式访问(屏幕固定 Screen Pinning)完整指南
  • Fluent Bit 日志合并正则表达式(上)
  • Docker守护进程安全加固在香港VPS环境的操作标准
  • n8n、Workflow实战
  • PyCharm Community 2024.2.3.exe 安装教程(详细步骤,附安装包下载)
  • 2-1〔O҉S҉C҉P҉ ◈ 研记〕❘ 漏洞扫描▸理论基础与NSE脚本
  • 《飞算JavaAI:新一代智能编码引擎,革新Java研发范式》
  • python3.10.6+flask+sqlite开发一个越南留学中国网站的流程与文件组织结构说明
  • 微调入门:为什么微调
  • LeetCode 分割回文串
  • MySQL-单表查询