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

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

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

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

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

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

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

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

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

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

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

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

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

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

© 版权声明

相关文章

2 条评论

  • 头像
    给我两斤桃 投稿者

    语法只是针对编译器,大修PE才是王道

    无记录
    回复
  • 头像
    塔利班学徒 读者

    收藏了,感谢分享

    无记录
    回复