C语言关键---static

static 这个关键字,我感受对不少初级程序源和刚接触程序的同窗来讲,可能都没有彻底理解它的含义。至少对我来讲对它的认识不是很清楚。所以对它在次总结一下。主要做为本身的备忘录。html

1.static关键字的第一特性:隐藏ios

static 在修饰变量时分为全局变量和局部变量,都存在静态存储区域。程序员

  • static全局变量:做用域是从定义的位置开始到整个所在cpp文件结束,其余cpp文件都不能使用static定义的变量,在同一个cpp文件中,在定义前使用要用extern关键字。所以static修饰变量会被隐藏在一个cpp文件里。数组

  • static 局部变量:做用域只在一个函数的内部使用,static局部变量是静态存储,所以在函数退出后,仍然保存值,再次进入函数时,static局部变量使用上次的值。函数

  •      在局部变量前,加上关键字static,该变量就被定义成为一个静态局部变量。 咱们先举一个静态局部变量的例子,以下: spa

    //Example 3
    #include <iostream.h>
    void fn();
    void main()
    {
     fn();
     fn();
     fn();
    }
    void fn()
    {
     static n=10;
     cout<<n<<endl;
     n++;
    }

      一般,在函数体内定义了一个变量,每当程序运行到该语句时都会给该局部变量分配栈内存。但随着程序退出函数体,系统就会收回栈内存,局部变量也相应失效。可是有时候咱们须要在两次调用之间对变量的值进行保存。一般的想法是定义一个全局变量来实现。但这样一来,变量已经再也不属于函数自己了,再也不仅受函数的控制,给程序的维护带来不便。  静态局部变量正好能够解决这个问题。静态局部变量保存在全局数据区,而不是保存在栈中,每次的值保持到下设计


  • static 修饰函数:函数前加 static 使得函数成为静态函数。但此处“static”的含义不是指存储方式,而是指对函数的做用域仅局限于本文件(因此又称内部函数)。使用内部函数的好处是:不一样的人编写不一样的函数时,不用担忧本身定义的函数,是否会与其它文件中的函数同名。指针

2.static的第二个做用是:保持变量内容的持久 code

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

       

#include <stdio.h>
 int fun(void){
     static int count = 10; // 事实上此赋值语句历来没有执行过,仅在程序初始化时,初始static局部变量count=10,之后就再也不执行。
   return count--;
   }
    int count = 1;
   int main(void) {
      printf("global\t\tlocal static\n");
      for(; count <= 10; ++count)
      printf("%d\t\t%d\n", count, fun());
    return 0; }


          

3. static的第三个做用是默认初始化为0.

其实全局变量也具有这一属性,由于全局变量也存储在静态数据区

    在静态数据区,内存中全部的字节默认值都是0x00,某些时候这一特色能够减小程序员的工做量。好比初始化一个稀疏矩阵,咱们能够一个一个地把全部元素都置0,而后把不是0的几个元素赋值。若是定义成静态的,就省去了一开始置0的操做。再好比要把一个字符数组当字符串来用,但又以为每次在字符数组末尾加‘\0’太麻烦。若是把字符串定义成静态的,就省去了这个麻烦,由于那里原本就是‘\0’。不妨作个小实验验证一下。

    

#include <stdio.h>
 int a;
int main(void){
int i;
static char str[10];
printf("integer: %d; string: (begin)%s(end)", a, str);
 return 0;
 }

    程序的运行结果以下integer: 0; string: (begin)(end)

    最后对static的三条做用作一句话总结。首先static的最主要功能是隐藏,其次由于static变量存放在静态存储区,因此它具有持久性和默认值0.

4. 用static声明的函数和变量小结

    static 声明的变量在C语言中有两方面的特征:

1)、变量会被放在程序的全局存储区中,这样能够在下一次调用的时候还能够保持原来的赋值。这一点是它与堆栈变量和堆变量的区别。

2)、变量用static告知编译器,本身仅仅在变量的做用范围内可见。这一点是它与全局变量的区别。

 Tips:
A.若全局变量仅在单个C文件中访问,则能够将这个变量修改成静态全局变量,以下降模块间的耦合度;
B.若全局变量仅由单个函数访问,则能够将这个变量改成该函数的静态局部变量,以下降模块间的耦合度;
C.设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,须要考虑重入问题;
D.若是咱们须要一个可重入的函数,那么,咱们必定要避免函数中使用static变量(这样的函数被称为:带“内部存储器”功能的的函数)
E.函数中必需要使用static变量状况:好比当某函数的返回值为指针类型时,则必须是static的局部变量的地址做为返回值,若为auto类型,则返回为错指针。

    函数前加static使得函数成为静态函数。但此处“static”的含义不是指存储方式,而是指对函数的做用域仅局限于本文件(因此又称内部函数)。使用内部函数的好处是:不一样的人编写不一样的函数时,不用担忧本身定义的函数,是否会与其它文件中的函数同名。

5.static 描述类的静态变量和函数:

C++重用了这个关键字,并赋予它与前面不一样的第三种含义:表示属于一个类而不是属于此类的任何特定对象的变量和函数(与Java中此关键字的含义相同)。

相关文章
相关标签/搜索