• 看不会你来真实我!!速进!!关于static在c语言中的具体作用详解!!


    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


    前言

    在我们学习c语言的过程中,相信大家都遇到过static,那么这到底是个啥玩意,到底怎么用,用起来有什么麻烦的地方?您先别急,且听我细细道来!!


    提示:以下是本篇文章正文内容,下面案例可供参考

    一、what is static?

    static在c语言中是类似for,break,continue的关键字,较为常见

    二、how to use static?

    here are three examples:

    1.修饰局部变量

    static修饰局部变量会使局部变量成为静态局部变量,静态局部变量和普通局部变量又有何不同?

    不多bb,看代码:

    主:

    1. #include
    2. int main()
    3. {
    4. for(int i=0;i<3;i++)
    5. {
    6. www();
    7. }
    8. return 0;
    9. }

    头文件:

    1. void www()
    2. {
    3. int i=0
    4. i++;
    5. printf("%d",i);
    6. }

    当此时,我们会打印出如下情况

    然而我们让代码稍加改变,加上今天的主角static,那么结果会截然不同:

     总结:

    1)第一个为什么打印了三个1:

    i作为局部变量在www函数中被定义,所以i的生命周期只会存在在函数www中,当调用函数www时i被定义生成,当函数结束时,则生命周期结束,函数销毁,在下一次创建时,将会重新创建新的i。

    2} 第二个为什么会打印连续整数:

    static修饰局部变量之后,将i的生命周期转变为全局变量的生命周期,因此,在每一次调用这个函数的时候www函数结束,但是变量i并没有被完全释放,在下一次调用函数www时,对i也不重新定义和初始化,降延续上一次结束时i的值,所以自然上述函数将打印连续不断的整数

    3.修饰全局变量:

    当static修饰全局变量之后,会将原本储存在静态存储区的全局变量变成静态全局变量,当此时,static不得在其他文件中使用,此时,你可以把它当成本文件的私有变量!!!

    4.修饰函数

    static 修饰一个函数,则这个函数的只能在本文件中调用,不能被其他文件调用。static 修饰的变量存放在全局数据区的静态变量区,包括全局静态变量和局部静态变量,都在全局数据区分配内存。初始化的时候自动初始化为 0。

    5.数据安全性

    考虑到数据安全性(当程序想要使用全局变量的时候应该先考虑使用 static)

    总结!!!

    静态变量与普通变量

    1.静态全局变量有以下特点:

    • (1)静态变量都在全局数据区分配内存,包括后面将要提到的静态局部变量;
    • (2)未经初始化的静态全局变量会被程序自动初始化为0(在函数体内声明的自动变量的值是随机的,除非它被显式初始化,而在函数体外被声明的自动变量也会被初始化为 0);
    • (3)静态全局变量在声明它的整个文件都是可见的,而在文件之外是不可见的。

    优点:静态全局变量不能被其它文件所用;其它文件中可以定义相同名字的变量,不会发生冲突。

    (1)全局变量和全局静态变量的区别

    • 1)全局变量是不显式用 static 修饰的全局变量,全局变量默认是有外部链接性的,作用域是整个工程,在一个文件内定义的全局变量,在另一个文件中,通过 extern 全局变量名的声明,就可以使用全局变量。
    • 2)全局静态变量是显式用 static 修饰的全局变量,作用域是声明此变量所在的文件,其他的文件即使用 extern 声明也不能使用。

    2. 静态局部变量有以下特点:

    • (1)该变量在全局数据区分配内存;
    • (2)静态局部变量在程序执行到该对象的声明处时被首次初始化,即以后的函数调用不再进行初始化;
    • (3)静态局部变量一般在声明处初始化,如果没有显式初始化,会被程序自动初始化为 0;
    • (4)它始终驻留在全局数据区,直到程序运行结束。但其作用域为局部作用域,当定义它的函数或语句块结束时,其作用域随之结束。

    一般程序把新产生的动态数据存放在堆区,函数内部的自动变量存放在栈区。自动变量一般会随着函数的退出而释放空间,静态数据(即使是函数内部的静态局部变量)也存放在全局数据区。全局数据区的数据并不会因为函数的退出而释放空间。

  • 相关阅读:
    内存利用:迟来的blindless与逃不掉的exit漏洞
    tomcat探究二搭建简单的servlet容器
    CAS(Compare and swap)比较并交换算法解析
    jQuery小结二
    anylogic 学习(3)—— 智能体相关操作
    延时任务(三)-基于redis zset的完整实现
    Docker部署jenkins
    POJ3275 Ranking the Cows题解
    模板学堂丨禅道业务数据分析大屏
    pandas drop 方法
  • 原文地址:https://blog.csdn.net/m0_72018048/article/details/126394388