• C--静态变量和静态函数static


    1. 静态局部变量:

    #include <stdio.h>
    
    //在本地变量定义时加上static修饰符就成为静态本地变量 
    //当函数离开的时候,静态本地变量会继续存在并保持其值
    //静态本地变量的初始化只会在第一次进入这个函数时做,以后进入函数时会保持上次离开时的值
    //静态本地变量的实质是特殊的全局变量 
    //静态本地变量具有全局的生存期,函数内的局部作用域
    
    void f(void) {
        static int a = 1;
    //静态局部变量一般在声明处初始化,如果没有显式初始化,会被程序自动初始化为0(局部变量不会被初始化);    
        //它始终驻留在全局数据区,直到程序运行结束。但其作用域为局部作用域,也就是不能在函数体外面使用它
        a += 5;
        printf("%d
    ", a);
    }
    
    
    int main()
    {
        f();
        f();
        f();
    
        return(0);
    }

    c/c++的内存分布,以及static所在的区间:

    对于一个完整的程序,在内存中的分布情况如下图:

    1.栈区: 由编译器自动分配释放,像局部变量,函数参数,都是在栈区。会随着作用于退出而释放空间

    2.堆区:程序员分配并释放的区域,像malloc(c),new(c++) 

    3.全局数据区(静态区):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束释放

    4.代码区

    2.静态全局变量:

    全局变量、静态全局变量这两者在存储方式上并无不同,区别在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它

     

    3.静态函数: 

    准确的说,静态函数跟静态全局变量的作用类似 

    
    
    static函数与普通函数的区别是:用static修饰的函数,限定在本源码文件中,不能被本源码文件以外的代码文件调用。而普通的函数,默认是extern的,也就是说它可以被其它代码文件调用

    定义静态函数有以下好处:
      <1> 其他文件中可以定义相同名字的函数,不会发生冲突。
      <2> 静态函数不能被其他文件所用。

     

     

     

  • 相关阅读:
    Java多线程之等待唤醒机制
    Java多线程之线程间的通信
    Java多线程之八锁问题
    Java多线程之基础
    el-table的动态合并行和列
    服务器、IP地址和域名之间有什么关系?
    node学习ing
    swipper的轮播图
    swipper内的部分区域的滚动(overflow: auto)与整个屏幕滚动冲突
    vue项目中引入 html2canvas ,控制台报错 Cannot assign to read only property 'className' of object '#< SVGSVGElement >'
  • 原文地址:https://www.cnblogs.com/liming19680104/p/13375619.html
Copyright © 2020-2023  润新知