精华内容
下载资源
问答
  • 1、全局变量: 存储区在静态存储区。作用域为整个源程序( 当一个源程序由多个源文件组成时,非静态的...static全局变量只初使化一次,防止在其他文件单元被引用。 3、局部变量: 存储区是栈区,离开函数体就释放内存

    1、全局变量:
    存储区在静态存储区。作用域为整个源程序( 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的)。
    2、静态全局变量:
    存储区也在静态存储区。static限制作用域,作用域为本文件内有效(定义该变量的源文件内), 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。
    static全局变量只初使化一次,防止在其他文件单元中被引用。
    3、局部变量:
    存储区是栈区,离开函数体就释放内存。局部变量也可以在堆上进行动态的分配,但须记得释放空间。
    4、静态局部变量:
    存储区变为静态存储区。当一个函数里面有一个static修饰的局部变量的时候,如果反复调用多次,那么下一次函数用的该变量的值不会再被初始化一次了(不执行static修饰的变量初始化语句),而是采用上一次函数执行完之后此变量的值。静态的局部变量如果没有被初始化,会自动被编译器赋值为0。
    静态局部变量只对定义它的函数体始终可见,函数体执行完过后虽然还存在,但是无法被其他的使用了。 在该函数的调用过程中,这个变量作为全局变量可以被使用。且不随着函数结束释放掉,整个程序结束的时候才被释放掉,但是不被其他的函数所引用。跟真正的全局变量还是有区别的。真正的全局变量是所有的函数都可以访问到。
    正是由于static局部变量的这种特性,使得静态局部变量的函数变得不可重入,即每次调用可能会产生不同的结果,这在多线程编程时可能会成为一种隐患。

    5、总结:static三个重要作用:
    1)隐藏。当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。

    2)static的第二个作用是保持变量内容的持久。在程序刚开始运行时就完成初始化,也是唯一的一次初始化。

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

    static int a = 1;
    void fun1(void){ a = 2; }
    void fun2(void){ int a = 3; }
    void fun3(void){ 
    	static int a = 4; //第二次调用fun3()函数,没有进行a的初始化。
    	a++;
    	cout << "静态局部a= " << a << endl;
    }
    int main(int argc, char** args){
    	a = 5;
    	cout << a << endl;
    	//printf("%d", a);
    	fun1();
    	cout << a << endl;
    	fun2();
    	cout << a << endl;
    	fun3();
    	cout << a << endl;
    	fun3();
    	system("pause");
    	return 0;
    }
    

    6、静态函数和普通函数:
    static函数与普通函数作用域不同,仅在本文件。只在当前源文件中使用的函数应该说明为内部函数(static修饰的函数),内部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件.
    static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝。
    这个讲的不好 再总结!

    静态成员函数不能声明成const:
    static静态成员属于类的,不属于某个具体的对象,所有对象共用static成员。this指针是某个具体对象的地址,因此static成员函数没有this指针。而函数中的const,其实是用来修饰this指针的,意味着this指向的内容不可变(指针常量),所以const不能用来修饰static成员函数。

    展开全文
  • 全局变量 全局变量默认初始化为0,字符型变量为空字符’’ 定义在函数外,可被本文件及其他文件的函数使用...同一文件全局变量和局部变量可以同名,在局部变量作用域内,全局变量不起作用 静态全局变量 静态...
    1. 全局变量
      • 全局变量默认初始化为0,字符型变量为空字符’’
      • 定义在函数外,可被本文件及其他文件的函数使用(外部链接),其他文件使用时序用extern声明
      • 生命周期和程序运行周期一样
      • 不同文件的全局变量不可以重名
    2. 局部变量
      • 如果没有赋初值,内容为随机
      • 如果定义在符合语句内,只在复合语句中有效
      • 同一文件中全局变量和局部变量可以同名,在局部变量作用域内,全局变量不起作用
    3. 静态全局变量
      • 静态全局变量的值只初始化一次,默认初始化为0,字符型变量为空字符’’
      • 作用域限制在本文件内(内部链接),因此不同文件的静态全局变量可以重名
      • 生命周期和程序运行周期样
      • 存储在静态区
    4. 静态局部变量
      • 静态局部变量在函数第一次调用的时候构造,只初始化一次,默认初始化为0,字符型为空字符
      • 作用域为定义的函数内
      • 生命周期和程序运行周期一样
      • 存储在静态区
    5. 全局函数
      • c语言中的函数默认都是全局的,使用static关键字可以将函数声明为静态,静态函数只能在本文件中使用
    6. 静态函数
      • 静态函数只能在本文件中使用,因此不同文件的静态函数可以重名
    7. 总结
      类型	作用域	生命周期auto变量	一对{}内	当前函数static局部变量	一对{}内	整个程序运行期extern变量	整个程序	整个程序运行期static全局变量	当前文件	整个程序运行期extern函数	整个程序	整个程序运行期static函数	当前文件	整个程序运行期register变量	一对{}内	当前函数
    展开全文
  • 利用这一特性可以不同的文件定义同名函数和同名变量,而不必担心命名冲突。Static可以用作函数变量的前缀,对于函数来讲,static的作用仅限于隐藏,而对于变量,static还有下面两个作用。 ...

    从网络资源整理的static的三个作用

    第一个作用:对其他文件隐藏。

    所有未加static前缀的全局变量和函数都具有全局可见性,其它的源文件也能访问.如果加了static,就会对其它源文件隐藏。利用这一特性可以在不同的文件中定义同名函数和同名变量,而不必担心命名冲突。Static可以用作函数和变量的前缀,对于函数来讲,static的作用仅限于隐藏,而对于变量,static还有下面两个作用。


    第二个作用:保持[变量]内容的持久。

    存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。static局部变量只被初始化一次,下一次依据上一次结果值。共有两种变量存储在静态存储区:全局变量和static变量,只不过和全局变量比起来,static可以控制变量的可见范围,说到底static还是用来隐藏的。


    第三个作用:使[变量]默认初始化为0。

    其实全局变量也具备这一属性,因为全局变量也存储在静态数据区。在静态数据区,内存中所有的字节默认值都是0x00,某些时候这一特点可以减少程序员的工作量。

    下面是在网络上看到的一道中兴面试题:

    1. static全局变量与普通的全局变量有什么区别 ?

      全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。

      全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。

      这两者的区别在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。

      static全局变量只初使化一次,防止在其他文件单元中被引用;  

    2.  static局部变量和普通局部变量有什么区别 ?

       把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。 

      static局部变量只被初始化一次,下一次依据上一次结果值;  

    3.  static函数与普通函数有什么区别?

       static函数与普通函数作用域不同,仅在本文件。只在当前源文件中使用的函数应该说明为内部函数(static修饰的函数),内部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件.

    感谢:https://www.jb51.net/article/35912.htm

    展开全文
  • 静态局部变量具有局部作用域,它只被初始化一次,自从第一次被初始化直到程序运行结束都一直存在,它和全局变量的区别在于全局变量对所有的函数都是可见的,而静态局部变量只对定义自己的函数体始终可见。...

    1、从作用域看:

    1>全局变量具有全局作用域。全局变量只需在一个源文件中定义,就可以作用于所有的源文件。当然,其他不包含全局变量定义的源文件需要用extern 关键字再次声明这个全局变量。

    2>静态局部变量具有局部作用域,它只被初始化一次,自从第一次被初始化直到程序运行结束都一直存在,它和全局变量的区别在于全局变量对所有的函数都是可见的,而静态局部变量只对定义自己的函数体始终可见。

    3>局部变量也只有局部作用域,它是自动对象(auto),它在程序运行期间不是一直存在,而是只在函数执行期间存在,函数的一次调用执行结束后,变量被撤销,其所占用的内存也被收回。

    4>静态全局变量也具有全局作用域,它与全局变量的区别在于如果程序包含多个文件的话,它作用于定义它的文件里,不能作用到其它文件里,即被static关键字修饰过的变量具有文件作用域。这样即使两个不同的源文件都定义了相同名字的静态全局变量,它们也是不同的变量。

    2.从分配内存空间看:

    1>全局变量,静态局部变量,静态全局变量都在静态存储区分配空间,而局部变量在栈里分配空间

    2>全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。

    1)静态变量会被放在程序的静态数据存储区(全局可见)中,这样可以在下一次调用的时候还可以保持原来的赋值。这一点是它与堆栈变量和堆变量的区别。

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

    从以上分析可以看出, 把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。因此static 这个说明符在不同的地方所起的作用是不同的。应予以注意。

    Tips:

    A.若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度;

    B.若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度;

    C.设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑重入问题,因为他们都放在静态数据存储区,全局可见;

    D.如果我们需要一个可重入的函数,那么,我们一定要避免函数中使用static变量(这样的函数被称为:带“内部存储器”功能的的函数)

    E.函数中必须要使用static变量情况:比如当某函数的返回值为指针类型时,则必须是static的局部变量的地址作为返回值,若为auto类型,则返回为错指针。

     

    展开全文
  • 静态局部变量具有局部作用域,它只被初始化一次,自从第一次被初始化直到程序运行结束都一直存在,它和全局变量的区别在于全局变量对所有的函数都是可见的,而静态局部变量只对定义自己的函数体始终可见。...
  • static关键字c语言主要有两个作用。 一、修饰变量。变量又分为局部变量和全局变量,但他们都内存的静态区,静态变量只能被初始化一次。 静态全局变量,作用域仅...静态局部变量在函数体内定义的,就只能这...
  • 1.2 局部变量 只有局部作用域,它是自动对象(auto),它程序运行期间不是一直存在,而是只在函数执行期间存在,函数的一次调用执行结束后,变量被撤销,其所占用的内存也被收回。 1.3 静态全局变量 具有...
  • 静态全局变量 - 全局作用域+文件作用域,所以无法在其他文件使用。如果俩个文件定义了相同名字的静态局部变量,那他们是俩个不同的变量,而非一个。 局部变量 - 局部作用域,比如函数的参数,函数内的局部变量...
  • C++静态局部变量

    2019-11-06 13:33:37
    1 静态局部变量在静态存储区内分配存储单元。在程序运行期间都不释放。 2 对静态局部变量是在编译时赋初值的,即...4 静态局部变量在函数调用结束后仍然存在,但其他函数不能引用它,在其他函数中,它是"不可见"的...
  • 说明:(1)主函数定义的变量不能再其他函数中使用,主函数也不能使用其他函数定义的变量。 (2)形参变量属于被调函数的局部变量,实参变量属于主调函数的局部变量。 (3)允许不同的函数中使用相同的变量名,但...
  • 函数与局部、全局和静态局部变量 我们知道c++一个函数一般会有它的参数。 例如最简单的形式参数:这个参数也可以称为局部变量。 那么现在介绍什么叫局部变量: 我们知道,一个变量有它的作用域(也就是能引用该...
  • 2>静态局部变量具有局部作用域,它只被初始化一次,自从第一次被初始化直到程序运行结束都一直存在,它和全局变量的区别在于全局变量对所有的函数都是可见的,而静态局部变量只对定义自己的函数体始终可见。...
  • //------全局变量 静态全局变量-----------/*静态全局变量 全局变量就是 外部变量。外部变量就是全局变量。... 静态局部局部变量 静态局部在多次调用他所在的函数时,不重新分配内存--保存其值,而局部变量
  • 在其他不包含全局变量定义的源文件需要用extern关键词来再次声明这个全局变量 局部变量局部变量只有局部作用域,它只在函数调用执行期间存在,函数一次调用执行结束后,变量被撤销,其所占用的的内存也被回收...
  • 全局变量具有全局作用域。全局变量只需一个源文件定义,就可以作用于所有的源文件。当然,其他不包含全局变量定义的源文件需要用extern ...静态局部变量具有局部作用域,它只被初始化一次,自从第一次被初始化
  • 2、静态局部变量具有局部作用域,它只被初始化一次,自从第一次被初始化直到程序运行结束都一直存在,它和全局变量的区别在于全局变量对所有的函数都是可见的,而静态局部变量只对定义自己的函数体始终可见。...
  • C++ 变量根据定义的位置的不同的...静态局部变量具有局部作用域,它只被初始化一次,自从第一次被初始化直到程序运行结束都一直存在,它和全局变量的区别在于全局变量对所有的函数都是可见的,而静态局部变量只对定义自
  • static/静态全局变量作用域有限,局限一个源文件内(定义它的源文件),不能被同一源程序的其他源文件使用,避免引起错误。(因而同名静态全局变量可以被定义不同源文件,使用关键字static) 普通全局变量...
  • 学习要总结,不然全忘了,最近学c++,记录一下:    全局变量: 程序生命周期存在,只需一个源文件定义。... 静态局部变量: 只被初始化一次,存在于程序生命周期,只定义的函数内可见    局部...
  •  全局变量的作用范围是整个程序(如果程序是多个文件,必须在其他的文件说明)。  静态变量的作用范围要看静态变量的位置,如果在函数里,则作用范围 就是这个函数。  静态全局变量,只在本文件可以用,...
  • 全局变量的作用范围是整个程序(如果程序是多个文件,必须在其他的文件说明)。 静态变量的作用范围要看静态变量的位置,如果在函数里,则作用范围 就是这个函数静态全局变量,只在本文件可以用,虽然整
  •  (1)在函数体内部或者复合语句定义的变量称为局部变量。  (2)作用域为当前的函数体。  (3)栈区(动态存储区)分配。  (4)函数调用时开始分配,调用结束时释放。 2.全局变量:  (1)在函数体...
  • 全局变量的作用范围是整个程序(如果程序是多个文件,必须在其他的文件说明)。 静态变量的作用范围要看静态变量的位置,如果在函数里,则作用范围就是这个函数。 <br /> 静态全局变量,只本...
  •   根据局部和全局、静态和非静态,... 静态局部变量声明它的函数中可用;   4. 静态全局变量只声明它的源文件中可用,其他源文件不可用。   从存储域(生存周期)上:   1. 局部变量存储栈区,函数返
  • 全局变量:其是所有的函数体的外部定义的,程序的所有部分(甚至是其他文件中的代码都可以使用,存储程序部分的静态存储区,也就是作用域为整个...静态局部变量:出现一个作用域内,是局限一个函数中的,经...
  • 为了便于理解,我们先来说说面向过程设计的static,对理解面向...静态局部变量保存全局数据区,而不是保存,每次的值保持到一下次的调用,直到下次赋值; 静态函数只能声明它的文件当中可见,不能被其他

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,026
精华内容 410
关键字:

静态局部变量在其他函数中