zoukankan      html  css  js  c++  java
  • static关键字的作用

    1:隐藏

    假如一个工程中存在a.c、 b.c 以及main.c等C文件。

    静态函数

    在函数的返回类型前加上关键字static,函数就被定义成为静态函数。

    (在a.c文件中的函数名前加static,则这个函数只能在a.c中调用,而不能被b.c或 main.c调用)

     函数的定义和声明默认情况下是extern的,但静态函数只是在声明他的文件当中可见,不能被其他文件所用。

    局部静态变量

     

    在局部变量之前加上关键字static,局部变量就被定义成为一个局部静态变量。

     

      1)内存中的位置:静态存储区

     

      2)初始化:未经初始化的全局静态变量会被程序自动初始化为0(自动对象的值是任意的,除非他被显示初始化)

     

      3)作用域:作用域仍为局部作用域。

    静态局部变量相当于全局变量(只是只有在这个函数中能访问,但是生命周期是和全局变量差不多的),函数退出之后变量还在,要等到整个程序运行完才释放的,而且只在第一次进入变量定义的时候做初始化,以后会跳过初始化语句,保留原来的值(也就是说,如果item是static的,那么只有在第一次进入这个函数的时候会执行item=0,以后都不会执行。)

     

    2 :static的第二个作用是保持变量内容的持久。

      存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。共有两种变量存储在静态存储区:全局变量和static变量,只不过和全局变量比起来,static可以控制变量的可见范围,说到底static还是用来隐藏的。虽然这种用法不常见,但我还是举一个例子。

     

     1 #include <stdio.h>
     2 
     3 int fun(void){
     4     static int count = 10;    // 事实上此赋值语句从来没有执行过
     5     return count--;
     6 }
     7 
     8 int count = 1;
     9 
    10 int main(void)
    11 {    
    12     printf("global		local static
    ");
    13     for(; count <= 10; ++count)
    14         printf("%d		%d
    ", count, fun());    
    15     
    16     return 0;
    17 }

     

      

    如果static int count = 10; 被当做一个正常的语句执行,会在每次调用fun函数的时候都将count初始化成10,显然事实不是这样。所以这条赋值语句虽然写在那里,但其实没有在代码编译后的机器指令里存在。既然赋值语句都没有执行,它的初始值为什么会是10呢?事实上在编译阶段,就把可执行文件中为这个变量分配的静态存储区的值给赋成了10,程序在加载的时候将10直接读入内存,而不会有“赋值”这个动作了。

    3)static的第三个作用是默认初始化为0

  • 相关阅读:
    LeetCode: Reverse Words in a String && Rotate Array
    LeetCode: Maximum Product Subarray && Maximum Subarray &子序列相关
    =new、=null、.clear()、system.gc()的区别
    对象转字符串的效率问题
    Java遍历Map对象的四种方式
    JDK升级
    eclipse的任务列表
    统一修改数据库表名字段大小写
    get传数组
    vue编辑回显问题
  • 原文地址:https://www.cnblogs.com/prayer521/p/5860705.html
Copyright © 2011-2022 走看看