c语言static用法不懂?超详细教程+避坑指南让你快速掌握

admin C语言 6


是不是刚学 C 语言,看到代码里的 static 就发懵?课本上写的 “静态存储类别”“内部链接” 啥的,根本看不懂。想问问别人吧,又怕被说这么简单都不会。其实啊,static 这东西看着难,实际就那几种用法,今天兔子哥就用大白话给你讲透,再告诉你新手最容易踩的坑,保证你看完就会用,一起往下看吧!


static 到底是个啥?先搞懂最基本的
简单说,static 就是个 “修饰符”,能给变量和函数加一些特殊属性。你可以把它理解成给变量或函数贴了个标签,贴上之后,它们的 “行为习惯” 就变了。
那它具体能贴在哪些东西上呢?主要有三种:局部变量、全局变量、函数。这三种用法各有各的特点,咱们一个一个说。


给局部变量贴 static 标签,它会变 “长情”
平常咱们在函数里定义的变量,比如 int a = 0;,这叫局部变量。函数一结束,它就 “消失” 了,下次调用函数,又得重新开始。但加了 static 之后,它就像变 “长情” 了一样,会记住上次的值。
看个例子就明白了:
plaintext
#include void test() {int normal = 0; // 普通局部变量static int stat = 0; // 贴了static的局部变量normal++;stat++;printf("普通的:%d,带static的:%d\n", normal, stat);}int main() {test();test();test();return 0;}

运行结果会是这样:
普通的:1,带 static 的:1
普通的:1,带 static 的:2
普通的:1,带 static 的:3
看到没?普通变量每次都是 1,因为它每次都重新开始;带 static 的却能记住上次的结果,一次比一次大。这种特性最适合用来计数,比如统计一个函数被调用了多少次,用它就特别方便。
可能有人会问,那它变成全局变量了吗?不是的哦,它还是局部变量,只能在这个函数里用,出了这个函数就访问不了,这点可别搞错了。


给全局变量贴 static 标签,它会变 “宅”
全局变量就是在函数外面定义的变量,本来可以在整个项目的所有文件里用。但加了 static 之后,它就变 “宅” 了,只在自己所在的文件里活动,别的文件想找它都找不到。
比如在 a.c 里写:
static int num = 100; // 带 static 的全局变量
然后在 b.c 里想用到它:
extern int num; // 声明一下,想借用 a.c 的 num
printf ("% d", num); // 试着打印
这时候编译肯定会报错,说找不到 num。这就好比给全局变量划了个小圈子,只能在自己文件里待着。为啥要这么做呢?主要是怕重名。项目大了,文件多,很容易起一样的变量名,用 static 圈起来,就不会互相打扰了。


给函数贴 static 标签,它会变 “内向”
函数也能贴 static 标签,贴上之后,它就变 “内向” 了,只跟自己文件里的代码打交道,别的文件想调用它,门儿都没有。
比如在 file1.c 里定义:
static void say_hello () {
printf ("你好呀 \n");
}
然后在 file2.c 里想调用 say_hello (),编译的时候就会报错,说找不到这个函数。这种用法适合那些 “小帮手” 函数,它们只在当前文件里有用,没必要让所有人都看见。兔子哥写代码时,经常把一些辅助性的小函数贴个 static 标签,这样别人看代码的时候,就知道这些函数不用在别的地方调用,能省不少事。


一张表格看清三种用法的区别,再也不混
贴标签的对象具体变化通俗理解
局部变量函数结束不消失,记住上次的值变成长情的,忘不了过去
全局变量只能在自己文件里用变成宅的,不出串门
函数只能在自己文件里被调用变成内向的,不爱交际



新手用 static 最容易踩的坑,提前给你标出来
  1. ** 以为 static 局部变量能全局用 **:好多新手看到 static 局部变量能记住值,就以为它变成了全局变量,想在别的函数里用,结果肯定报错。记住,它再长情,也只在自己的函数里待着。

2.** 给变量乱贴 static 标签 **:有些人觉得 static 好用,就给所有变量都贴上,结果搞得代码乱七八糟。其实大部分时候,普通变量就够用了,别瞎贴。
3.** 初始化时用变量给 static 变量赋值 **:static 变量只能用常量初始化,比如 static int a = 5; 行,但 static int a = b; 就不行,哪怕 b 是全局变量也不行。编译器会直接报错,这点要特别注意。
4.** 觉得 static 函数比普通函数高级 **:根本没有这回事!static 只是限制了函数的使用范围,不是说它功能更强。该用普通函数的时候就用普通函数,别为了用 static 而用 static。


什么时候该用 static?兔子哥给你点建议
其实很简单,记住这几个场景就行:
  • 想让函数里的变量记住上次的值,比如计数,就用 static 局部变量。
  • 定义的全局变量只想在当前文件用,怕跟别的文件重名,就贴 static 标签。
  • 写的小函数只在当前文件有用,不想让别的文件调用,就用 static 函数。

刚开始学的时候,不用强求自己一下子全掌握,碰到对应的场景了,再回头看看这篇文章,慢慢就熟了。兔子哥当初学的时候,也是写了好几个小程序,才真正搞明白 static 的用法。
最后想说,编程这东西,光看不行,得动手试。把上面的例子敲一遍,改改参数跑跑看,比看十遍书都有用。别怕犯错,错一次就知道下次该咋用了。希望这些能帮到你,有啥不懂的,随时来问兔子哥!

标签: 是不是 看不懂

发布评论 0条评论)

  • Refresh code

还木有评论哦,快来抢沙发吧~