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

C语言关键字static的使用详解

初探“static”,一点儿C语言记忆碎片

程序运行的时候,内存就那么几块地方,放代码,放数据,还有没初始化的数据,所有人都觉得这些东西很重要,程序才能跑起来,代码放代码段,初始化的数据放data段,bss段就放那些还没动过的数据,它们都在那里等着,等着被使用,text段比较特殊,它一般是只读的,有时候也能写,data和bss就不一样了,它们是随便读写的。

C语言看内存,分得更细,栈,堆,全局静态区,常量区,代码区,感觉像把一个东西切成好几块,栈是自动的,函数调用就用它,局部变量也放这儿,堆得自己动手,申请,释放,不然就麻烦了,全局静态区,放全局变量,静态变量,常量区呢,放那些不能改的东西,字符串常量就在那儿,代码区,就是代码待的地方,CPU眼里的内存,跟C语言看到的,不太一样,代码段,数据段,堆栈段,这些是CPU关心的,C语言呢,更关注变量怎么用。

要理解变量在哪儿,得先看看可执行文件怎么和内存挂钩,UNIX系统就做得不错,可以看看它怎么把文件变成内存地址,这样才能明白,程序里的东西,到底存在哪儿,一开始觉得有点难,但慢慢就明白了。

全局变量,整个项目都能用,听着挺方便的,可要是名字撞了,那可就麻烦了,静态全局变量就不一样,只能在自己的文件里用,别人想用都用不了,这样就减少了冲突的可能,它们都住在全局数据区,但是静态全局变量,被限制住了,作用域小多了,你跨文件访问试试,肯定不行,编译器会告诉你,没门儿。

局部变量,函数调用的时候才出现,函数结束就消失了,像一阵风,静态局部变量就不一样了,程序活着,它就活着,而且只初始化一次,下次再用,还是上次的值,挺有个性的,局部变量住在栈里,静态局部变量呢,跑到了全局数据区,真是个特别的存在,函数被多次调用,看看局部变量和静态局部变量,你就明白,它们到底有什么不一样了。

还有静态函数,前面加个static,它的作用范围,就被限制在这个文件里了,别人想用,根本找不到,很多人都觉得这个东西特别有用,可以避免名字冲突,保护函数不被乱用,还能创建只能自己用的函数,静态函数一直待在内存里,不用每次都加载,感觉效率高了一点,所有人都觉得这样挺好的。

你在不同的文件里,试试调用静态函数,看看编译器怎么说,它会告诉你,这个函数是私有的,别想乱用,这东西确实有用,能让你写代码的时候,更安心,不会担心别人乱改,或者名字冲突,真的,是,这东西很实用。

有个问题,挺有意思的,如果我想自己写一个函数,名字跟库函数一样,而且还在自己的函数里,用原来的库函数,怎么办,大家都在想,这到底是怎么一回事,彭老师讲过,你可以去找找他的文章,看看他是怎么一步一步解决这个问题的,很多人看完这个故事,都会去想,原来C语言还有这么多好玩的东西,真的,很有意思,这东西确实实用。

就比如,sprintf, 格式化输出到字符串,stdlib.h 里的atoi,把字符串变成整数,math.h 里的sqrt,算平方根,string.h 里的strcmp,比较字符串,time.h 里的time,获取当前时间,这些函数我们经常用,有一天,你突发奇想,想自己写一个strcmp,而且想在你的strcmp里,调用系统原来的strcmp,这听起来,有点疯狂,但是,这确实可以做到。

static 还可以用来定义内部链接的变量和函数,这是一种非常有用的技术,可以帮助你隐藏实现细节,防止命名冲突,提高代码的可维护性和可重用性,比如,在一个C文件中,你定义了一个static int count = 0,那么这个count变量只能在这个文件中使用,其他文件无法访问它,这就避免了与其他文件中同名变量的冲突,同时,也隐藏了count变量的实现细节,其他文件不需要知道count变量的存在,只需要调用这个文件提供的接口即可。

再比如,在一个C文件中,你定义了一个static void helper_function(),那么这个helper_function函数只能在这个文件中使用,其他文件无法调用它,这就避免了与其他文件中同名函数的冲突,同时,也隐藏了helper_function函数的实现细节,其他文件不需要知道helper_function函数的存在,只需要调用公开的接口即可,这种技术在编写大型程序时非常有用,可以帮助你将程序分解成多个小的模块,每个模块负责一个特定的功能,模块之间通过定义明确的接口进行交互,模块内部的实现细节则被隐藏起来,这样可以降低程序的复杂性,提高代码的可维护性和可重用性。

所有人都觉得,static 是 C 语言里一个很重要的关键字。可是在那种环境下,谁能受得了,一直想着内存,作用域,生存期,真的很累,但没办法,想学好 C 语言,就得啃这些东西,啃明白了,才能写出更牛的代码,静态全局变量,静态局部变量,静态函数,这些东西,都有自己的特点,用对了地方,就能发挥很大的作用,否则,就会给自己挖坑,真的,是,这东西很实用,要好好学,这东西确实有用,能让你写代码的时候,更安心,不会担心别人乱改,或者名字冲突,真的,很有意思,这东西确实实用。

C 语言就是这样,细节很多,但是也很强大,只要你用心去学,就能掌握它,写出高质量的程序,记住,static 只是 C 语言里的一小部分,还有很多东西等着你去探索,去学习,加油吧,少年,所有人都觉得你以后肯定会成为一个 C 语言高手。

http://www.jsqmd.com/news/648344/

相关文章:

  • CCF 信息学奥赛系列书籍
  • 手机里的高速数据通道:一文搞懂M-PHY LANE在UFS存储中的关键作用
  • 基于STM32的智能药箱系统开发实战:从硬件搭建到云端监控
  • TI C2000 DSP2837xD双核开发避坑指南:手把手配置IPC通信与共享内存
  • GeographicLib 在 SLAM 中的高效应用:Ubuntu 18.04 下 C++ 实战解析
  • 从零搭建8发8收软件无线电系统:ZU909+ADRV9009实战指南(附原理图解析)
  • 从零解析:手把手教你定制自己的docker-entrypoint.sh脚本
  • 从零到一:基于51单片机与CH451的趣味打地鼠游戏开发实战
  • 从棋盘效应到HDC:空洞卷积在语义分割中的5个典型问题与调优方案
  • 别再手动编译了!用Docker 5分钟搞定StarRocks 3.3.2单机版部署(附华为云镜像加速)
  • 昆仑通态McgsPro连接阿里云IoT:当数据上报失败时,我这样一步步抓包排查
  • STM32F103R6 GPIO配置全攻略:从浮空输入到复用功能的7种模式详解
  • 避开这些坑!Cadence Virtuoso Layout XL中Via设置的常见错误与优化技巧
  • 如何在 Tkinter 网格中动态增删行
  • 统一基态生成论与考拉兹猜想的严格证明(期刊速投版)【乖乖数学】
  • 别再乱装PyTorch了!手把手教你用conda搞定Linux下CUDA驱动、Toolkit和PyTorch的版本匹配(附保姆级避坑清单)
  • UART状态机实战:如何高效发送多字节数据并优化代码结构
  • 揭秘千亿参数多模态模型推理成本暴增真相:3类隐性开销正在吞噬87%算力预算
  • 开发者如何平衡深度与广度?技能树优化法
  • 2026年热门的定制香薰蜡烛主流厂家对比评测 - 行业平台推荐
  • DSP28377D串口通信避坑指南:从FIFO深度、中断优先级到波特率误差的实战调优
  • 从零搭建多模态模型并行训练框架:PyTorch+FSDP+DeepSpeed+Colossal-AI四体联动,7天交付可复现Pipeline
  • Flutter 状态管理新范式 GetX(一)响应式编程入门实战
  • H5U与FX5U自由口通信实战:手把手教你用梯形图点亮Y0-Y7(附完整代码)
  • 【多模态大模型增量学习实战指南】:20年AI架构师亲授3类工业级避坑策略与5步可落地训练框架
  • PyTorch 2.8镜像免配置实战:直接运行Diffusers示例代码生成首支视频
  • 【实战】在Ubuntu 20.04中集成absl至ROS项目:从编译到部署
  • 紧急预警:2024年Q3起,Llama-3-Vision、Qwen-VL等主流开源多模态模型在边缘设备运行时功耗超标率达68%——3套轻量化迁移方案限时公开
  • 从串口指令到实战:深入解读小米IoT平台为ESP32-WROOM-32提供的初始化指令集与调试技巧
  • 别再让WSL吃光你的内存!一个命令搞定Ubuntu子系统内存释放(附原理详解)