• C语言丨静态关键字static的三种用法总结


    不同于其他关键字,他们都有多种用法,而且在一定环境下使用,可以提高程序的运行性能,优化程序的结构。这篇文章主要介绍了C语言中静态关键字static的作用,对大家学习C语言非常有帮助。


     

    静态关键字static

    C语言中,static关键字修饰变量和函数:

    1、局部变量

    2、全局变量

    3、函数

    static关键字最基本的用法是:

    1、被static修饰的变量属于类变量,可以通过类名.变量名直接引用,而不需要new出一个类来

    2、被static修饰的方法属于类方法,可以通过类名.方法名直接引用,而不需要new出一个类来

    被static修饰的变量、被static修饰的方法统一属于类的静态资源,是类实例之间共享的,换言之,一处变、处处变。JDK把不同的静态资源放在了不同的类中而不把所有静态资源放在一个类里面,很多人可能想当然认为当然要这么做,但是是否想过为什么要这么做呢?个人认为主要有三个好处:

    1、不同的类有自己的静态资源,这可以实现静态资源分类。比如和数学相关的静态资源放在java.lang.Math中,和日历相关的静态资源放在java.util.Calendar中,这样就很清晰了

    2、避免重名。不同的类之间有重名的静态变量名、静态方法名也是很正常的,如果所有的都放在一起不可避免的一个问题就是名字重复,这时候怎么办?分类放置就好了。

    3、避免静态资源类无限膨胀,这很好理解。


     

    下面我们具体了解一下static关键字的用法。

    修饰局部变量

    1、用静态关键字static修饰的局部变量,在编译的过程中,会在数据区为该变量开辟空间,并对其进行初始化,如果代码中未对其进行初始化,则系统默认初始化为0。

    2、用static修饰的局部变量,会延长局部变量的寿命,超出函数的生存期。

    3、对静态关键字修饰的局部变量的初始化。

    以下面两个变量a和变量为b进行说明,在编译过程中,发现变量a和b是静态变量,会标识变量a与b,等到程序运行的时候,在主函数调用之前,对变量a和变量b分配空间,并对变量a进行初始化,由于变量b是由函数fun传递的参数进行初始化的,故会在程序调用函数时对变量b进行初始化,对变量b初始化之前,会检查变量b的标识位,如果标识位为0,就会拿函数参数x对其进行初始化,标识位为1就不进行初始化。

    static int a = 0;(编译过程进行初始化)

    static int b = x;(运行该代码的时候进行初始化)

    void fun(int x)

    {

    static int a = 10;

    static int b = x;

    a++;

    b++;

    }

    修饰全局变量

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

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

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

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

    修饰函数

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

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

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

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

    下面两个文件的例子说明使用static声明的函数不能被另一个文件引用:

    /* file1.c */

    #include <stdio.h>

    static void fun(void)

    {

        printf("hello from fun. ");

    }

    int main(void)

    {

        fun();

        fun1();

        return 0;

    }

    /* file2.c */

    #include <stdio.h>

    static void fun1(void)

    {

        printf("hello from static fun1. ");

    }

    使用 gcc file1.c file2.c编译时,错误报告如下:

    /tmp/cc2VMzGR.o:在函数‘main’中:

    static_fun.c:(.text+0x20):对‘fun1’未定义的引用

    collect2: error: ld returned 1 exit status

    修改文件,不使用static修饰符,可在另一文件中引用该函数:

    /* file1.c */

    #include <stdio.h>

    void fun(void)

    {

        printf("hello from fun. ");

    }

    /* file2.c */

    int main(void)

    {

        fun();

        return 0;

    }

    同样使用 gcc file1.c file2.c编译,编译通过,运行结果如下:

    -> % ./a.out

    hello from fun.

    总结

    static是一个很有用的关键字,使用得当可以使程序锦上添花。当然,有的公司编码规范明确规定只用于本文件的函数要全部使用static关键字声明,这是一个良好的编码风格。

    无论如何,要在实际编码时注意自己的编码习惯,尽量体现出语言本身的优雅和编码者的编码素质。

    以上就是关键字static的全部用法,希望对大家灵活运用关键字static有所帮助。


     

    如果你想更好的提升你的编程能力,学好C语言C++编程!弯道超车,快人一步!
    C语言C++学习企鹅圈子】,分享(源码、项目实战视频、项目笔记,基础入门教程)
    欢迎转行和学习编程的伙伴,利用更多的资料学习成长比自己琢磨更快哦!

    编程学习书籍:


     

    编程学习视频:


     
  • 相关阅读:
    Kubernetes源码client-go的workqueue
    (转)Golang语言heap剖析及利用heap实现优先级队列
    (转)Kubernetes GC设计原则
    Kubernetes kubefed使用Cluster Selector
    使用kubeadm添加新节点到集群及相关问题解决
    Kubeadm颁发证书延迟到10年
    kubeadm升级Kubernetes证书
    混合kubebuilder与code generator编写CRD
    (转)Go项目的vendor目录是否需要提交?看这一篇就知道了
    Java 将Excel转为et和ett格式
  • 原文地址:https://www.cnblogs.com/mu-ge/p/14276855.html
Copyright © 2020-2023  润新知