• C语言中static关键字用法


    C语言中static关键字用法

    2021年7月28日·席锦

    static关键字在c语言中比较常用,使用恰当能够大大提高程序的模块化特性,有利于扩展和维护。但是对于c语言初学者,static由于使用灵活,并不容易掌握。

    变量

    1.局部变量

    普通局部变量是再熟悉不过的变量了,在任何一个函数内部定义的变量(不加static修饰符)都属于这个范畴。编译器一般不对普通局部变量进行初始化,也就是说它的值在初始时是不确定的,除非对其显式赋值。

    静态局部变量使用static修饰符定义,即使在声明时未赋初值,编译器也会把它初始化为0。

    实例程序:

    1. #include
    2. int main(void)
    3. {
    4. int a, b;
    5. static int c, d;
    6. _asm int 3 // 中断,在调试模式下查看a,b,c,d的值。可以看到a,b的值与c,d的值不同
    7. printf("%d, %d", c, d); // 不加这一句无法在中断时查看到c,d的值。注意a,b未初始化不能使用
    8. return 0;
    9. }

    F5调试信息:

    普通局部变量存储于进程栈空间,使用完毕会立即释放。

    静态局部变量存储于进程的全局数据区,即使函数返回,它的值也会保持不变;但是其作用域为局部作用域,当定义它的函数结束时,其作用域随之结束。

    实例程序:

    1. #include
    2. void fun(void)
    3. {
    4. int n_1 = 10;
    5. printf("n=%d\n", n_1);
    6. n_1++;
    7. printf("n++=%d\n", n_1);
    8. }
    9. void fun_static(void)
    10. {
    11. static int n_2 = 10;
    12. printf("static n=%d\n", n_2);
    13. n_2++;
    14. printf("n++=%d\n", n_2);
    15. }
    16. int main(void)
    17. {
    18. // 普通局部变量,使用完毕会立即释放
    19. fun();
    20. printf("\n");
    21. fun();
    22. printf("--------------------\n");
    23. // 静态局部变量即使函数返回,它的值也会保持不变
    24. fun_static();
    25. printf("\n");
    26. fun_static();
    27. //printf("static n=%d\n", n_2); // 打开本行语句编译就无法通过,因为变量n_2的作用域仅在fun_static()函数内
    28. return 0;
    29. }

    运行截图:

    2.全局变量

    全局变量定义在函数体外部,在全局数据区分配存储空间,且编译器会自动对其初始化。

    普通全局变量对整个工程可见,其他文件可以使用extern外部声明后直接使用。也就是说其他文件不能再定义一个与其相同名字的变量了(否则编译器会认为它们是同一个变量)。

    静态全局变量仅对当前文件可见,其他文件不可访问,其他文件可以定义与其同名的变量,两者互不影响。

    在定义不需要与其他文件共享的全局变量时,加上static关键字能够有效地降低程序模块之间的耦合,避免不同文件同名变量的冲突,且不会误使用。

    实例程序:

    1. /* demo.h */
    2. #include
    3. /* demo.c */
    4. #include "demo.h"
    5. static int itest; // 在demo2.c中也有一个一模一样的定义,但是程序编译运行正常
    6. extern int itest2; // 若是去掉extern将编译失败
    7. int main(void)
    8. {
    9. printf("hello world.\n");
    10. return 0;
    11. }
    12. /* demo2.c */
    13. #include "demo.h"
    14. static int itest;
    15. int itest2;

    运行截图:

    函数

    函数的使用方式与全局变量类似,在函数的返回类型前加上static,就是静态函数。其特性如下:

    1)静态函数只能在声明或定义它的文件中可见,其他文件不能引用该函数

    2)不同的文件可以使用相同名字的静态函数,互不影响

    非静态函数可以在另一个文件中直接引用,甚至不必使用extern声明

    实例程序:

    1. /* demo.h */
    2. #include
    3. static void fun1(void);
    4. static void fun2(void);
    5. void callFun2(void);
    6. /* demo.c */
    7. #include "demo.h"
    8. static void fun1(void)
    9. {
    10. printf("hello from demo fun1.\n");
    11. }
    12. int main(void)
    13. {
    14. fun1(); // 静态函数,定义在本文件中,可以直接调用
    15. //fun2(); // 打开注释,将无法编译通过。原因:函数fun2()是静态函数,且不在本文件中声明或定义
    16. callFun2(); // 非静态函数可以在另一个文件中直接引用
    17. return 0;
    18. }
    19. /* demo2.c */
    20. #include "demo.h"
    21. static void fun2(void)
    22. {
    23. printf("hello from demo fun2.\n");
    24. }
    25. void callFun2(void)
    26. {
    27. fun2(); // 静态函数,定义在本文件中,可以直接调用
    28. }

    运行截图:

  • 相关阅读:
    深度学习(十一)---zed 调用yolov5 进行识别目标并实时测距
    上周热点回顾(8.7-8.13)
    记一次 .NET 某游戏服务后端 内存暴涨分析
    python+SQL sever+thinter学生宿舍管理系统
    Python_01_如何在CentOS7上安装Python3
    StatefulSet
    Web基础与http协议
    Jhipster介绍和使用
    微信小程序获取用户头像昵称组件封装(最新版)
    RabbitMQ3.13.x之十二_WindowsServer服务器安装RabbitMQ后无法连接问题及处理方法
  • 原文地址:https://blog.csdn.net/xijinno1/article/details/133896451