c语言static关键字怎么用一看就懂的用法详解与实例演示

admin C语言 6


是不是很多朋友学 C 语言时,看到 static 这个关键字就头疼?课本上写得云里雾里,什么 “静态存储”“作用域限制”,看着就犯困。可偏偏考试、面试又总爱考这个,不用还不行。其实啊,static 没那么难,今天兔子哥就用大白话给你讲明白它怎么用,再配上实例代码,保证你一看就懂,一起往下看吧!

static 修饰局部变量,让它有 “记忆”


先说说 static 最常见的用法 —— 修饰函数里的局部变量。咱们平常定义的局部变量,比如函数里的 int a;,每次调用函数都会重新初始化,函数结束就没了。但加了 static 之后,它就像有了记忆,下次调用还能记住上次的值。
看个例子就明白了:
plaintext
#include void test(){static int num = 0;  // 用static修饰局部变量num++;printf("num的值是:%d\n", num);}int main(){test();  // 第一次调用test();  // 第二次调用test();  // 第三次调用return 0;}

运行结果会是:
num 的值是:1
num 的值是:2
num 的值是:3
要是没加 static,三次调用都会输出 1。你看,加了 static 之后,num 就记住了上次加 1 的结果,是不是很像给变量加了个 “备忘录”?这种用法适合统计函数被调用的次数,或者需要累计计算的场景。

static 修饰全局变量,给它 “画个圈”


全局变量本来是整个项目都能用的,不管在哪个文件里,只要声明一下就能用。但加了 static 之后,它就被限制在自己所在的文件里了,别的文件想用时就会报错。
比如咱们在 a.c 里写:
static int global_num = 10; // 静态全局变量
然后在 b.c 里想引用它:
extern int global_num; // 声明一下
printf ("% d", global_num); // 尝试使用
编译的时候就会提示 “未定义的引用”。这就好比给全局变量画了个圈,只能在自己的地盘里活动。这么做有啥好处呢?避免不同文件里的全局变量重名,尤其是大项目,人多手杂,很容易起一样的名字,用 static 就能减少这种麻烦。

static 修饰函数,限制它的 “活动范围”


函数也能被 static 修饰,效果跟全局变量差不多 —— 让函数只能在自己所在的文件里被调用,别的文件看不见它。
比如在 file1.c 里定义:
static void print_hello () // 静态函数
{
printf ("Hello World!");
}
然后在 file2.c 里想调用它:
print_hello (); // 尝试调用
这时候编译会报错,说找不到这个函数。这种用法适合那些只在当前文件里用的小函数,不用暴露给其他文件,让代码结构更清晰。兔子哥写项目时,经常把一些辅助性的小函数用 static 修饰,省得别人误用。

一张表格总结 static 的三种用法,一目了然


修饰对象作用效果通俗理解
局部变量只初始化一次,函数结束后不释放,保留值给变量记笔记,下次接着用
全局变量只能在当前文件中使用,其他文件无法访问给变量画个圈,不让外人碰
函数只能在当前文件中被调用,其他文件无法调用给函数设个门,只让自己人进

新手用 static 常踩的坑,提前给你指出来


  • 别以为 static 修饰的局部变量变成了全局变量,它还是局部变量,只能在函数内部用,只是生命周期变长了而已。我当初就犯过这错,以为加了 static 就能在别的函数里用,结果折腾半天没搞懂为啥报错。
  • 全局变量和函数被 static 修饰后,虽然在其他文件里用不了,但在本文件里的用法跟普通的没区别,别想太多。
  • 初始化的时候要注意,static 变量只能用常量初始化,不能用变量。比如 static int a = b; 这样写是错的,b 要是个变量的话。

什么时候该用 static?用对了才香


有人可能会问,我不用 static 行不行?当然行,但用对了能让代码更规范。比如你写了个计数函数,每次调用都要加 1,用 static 局部变量就很方便;再比如项目里有个小函数,就当前文件能用,加个 static,别人就不会在别的地方瞎调用了。
兔子哥的经验是,不确定该不该用时,先不用。等写多了代码,遇到变量重名、函数被误调用这些问题时,自然就知道该在哪用 static 了。
最后想跟大家说,static 看着复杂,其实多用几个例子试试就明白了。最好的学习方法就是把上面的代码敲一遍,改改参数跑跑看,比光看书强十倍。刚开始可能会忘,但用多了自然就记住了。希望这篇文章能帮到你,有啥不懂的地方,随时来问兔子哥!

标签: 人多手杂 备忘录

发布评论 0条评论)

  • Refresh code

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