• 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修饰的静态变量只能在当前文件中使用

  • 相关阅读:
    沉睡者 - 大流量站项目
    vue中省市区
    每日一题 2304. 网格中的最小路径代价(中等,动态规划)
    Python 微信自动化工具开发系列04_所有微信群的群文件自动同步拷贝到群名对应的新文件夹中(2022年8月可用)
    四川建筑模板厂家推荐:能强优品木业提供优质货源
    拥有DOM力量的你究竟可以干什么
    怎么把Logstash 通过 Kibana 可视化监控起来?
    如何实现通过Leaflet加载dwg格式的CAD图
    一波未平一波又起,VMware发现一高危漏洞
    科技改变视听4K 120HZ高刷新率的投影、电视、电影终有用武之地
  • 原文地址:https://blog.csdn.net/qq_47896523/article/details/126390848