• C语言static关键字


    局部变量使用static修饰

    • 局部变量被static修饰后,我们称为静态局部变量
    • 对应静态局部变量在声明时未赋初值,编译器也会把它初始化为0
    • 静态局部变量存储于进程的静态存储区(全局性质),只会被初始化一次,即使函数返回,它的值也会保持不变

    1. void fn_static(void) {
    2. static int n = 10; //静态局部变量, 放在静态存储区,全局性质空间
    3. printf("\nstatic n=%d\n", n); // 10
    4. n++; // n = 11
    5. printf("\nn++=%d\n", n); // 11
    6. }
    7. int main(void) {
    8. /* fn();
    9. printf("--------------------\n");*/
    10. fn_static();
    11. printf("--------------------\n");
    12. /* fn();
    13. printf("--------------------\n");*/
    14. fn_static();//只初始化一次,所以n++会输出12
    15. }

    第二次调用fn_static()函数,不会再将n初始化为10,因为只能初始化一次,所以最后的结果是12

    1. void fn(void) {
    2. int n = 10; //普通变量, 每次执行都会初始化,n 在栈区
    3. printf("n=%d\n", n);
    4. n++;
    5. printf("n++=%d\n", n);
    6. }
    7. void fn_static(void) {
    8. static int n = 10; //静态局部变量, 放在静态存储区,全局性质空间
    9. printf("\nstatic n=%d\n", n); // 10
    10. n++; // n = 11
    11. printf("\nn = %d\n", n); // 11
    12. }
    13. int main(void) {
    14. fn();
    15. printf("--------------------\n");
    16. fn_static();
    17. printf("--------------------\n");
    18. fn();
    19. printf("--------------------\n");
    20. fn_static();//只初始化一次,所以n++会输出12
    21. getchar();
    22. return 0;
    23. }

    n=10
    n++=11
    --------------------

    static n=10

    n = 11
    --------------------
    n=10
    n++=11
    --------------------

    static n=11

    n = 12

     全局变量使用static修饰

    • 普通全局变量对整个工程可见,其他文件可以使用extern外部声明后直接使用。之后,其他文件不能再定义一个与其相同名字的变量了,静态全局变量仅对当前文件可见,其他文件不可访问,其他文件可以定义与其同名的变量,两者互不影响
    • 定义不需要与其他文件共享的全局变量时,加上static关键字能够有效地降低程序模块之间的耦合,避免不同文件同名变量的冲突,且不会误使用

    函数使用static修饰

    • 函数的返回方式与全局变量类似,在函数的返回类型前加上static,就是静态函数
    • 非静态函数可以在另一个文件中通过extern引用
    • 静态函数只能在声明它的文件中可见,其他文件不能引用该函数
    • 不同的文件可以使用相同名字的静态函数,互不影响
    1. int num = 10;//普通全局变量
    2. static int num2 = 20;//静态全局变量,只能在本文件中使用,而不能在其他文件使用
    1. #include
    2. void fun1(void) {//普通函数(非静态函数)
    3. printf("hello from fun1.\n");
    4. }
    5. static void fun2(void) {//静态函数, 它只能在本文件中使用
    6. printf("hello from fun2.\n");
    7. }
    1. #include
    2. //在一个文件中,使用另一个文件的全局变量,使用extern引用即可
    3. extern int num;
    4. //extern int num2;
    5. int num2 = 60;
    6. extern void fun1(void);
    7. void main() {
    8. printf("file02文件中num的值为%d\n", num);
    9. printf("file02文件中num2的值为%d\n", num2);
    10. fun1();
    11. getchar();
    12. }

    值得注意的是extern int num2编译过程中会出错,static修饰的静态变量只能在当前文件中使用

  • 相关阅读:
    自动化运维工具Ansible教程(一)【入门篇】
    应用安全四十二:SSO安全
    leetcode 13. 罗马数字转整数
    【LeetCode热题100】--189.轮转数组
    【QT配置第三方MQTT协议】
    【蜂鸟E203的FPGA验证】Chap.7 Vivado综合与性能分析-建立Vivado工程
    Sub-1G射频收发器soc芯片 UM2080F32 低功耗 32 位 IoTP
    许可分析 license分析 第十七章
    数据中台的前世今生(一):数据仓库——数据应用需求的涌现
    前端 JS 经典:浏览器中 ESModule 的工作原理
  • 原文地址:https://blog.csdn.net/qq_47896523/article/details/126390848