精华内容
下载资源
问答
  • 全局变量(外部变量)的说明之前再冠以static就构成了静态的全局变量全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。这两者存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是...

    存储方式:

            全局变量本身就是静态存储方式,静态全局变量也是静态存储方式。

    作用域:

            C程序可以由多个源文件组成。一个文件中定义全局变量,其他的文件中可以使用extern方式声明后,使用该全局变量。如果希望当前文件中的全局变量不能被其他文件使用,可以在全局变量的定义前加上关键字static,这样该全局变量就是一个static全局变量。

            在测试上面所说的作用域时不要用下面代码:

    test.h

    int a = 2;                //普通全局变量
    static int s = 5;         //static全局变量
    

    test.c

    #include <stdio.h>
    #include "test.h"
    
    int main()
    {
        printf("%d\n", a);
        printf("%d\n", s);        //这里会输出s的值
    }
    
             因为#include的头文件是把头文件内容直接加载源文件中,所以test.c也能访问变量s;

    #include也是可以包含 .c 文件的,但是不规范;


    补充static修饰局部变量和函数:

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

     

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

     

      static全局变量与普通的全局变量有什么区别:static全局变量只初使化一次,防止在其他文件单元中被引用;

      static局部变量和普通局部变量有什么区别:static局部变量只被初始化一次,下一次依据上一次结果值;

      static函数与普通函数有什么区别:static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝

     

    存储地方:

      程序的局部变量存在于(堆栈)中,全局变量存在于(静态区 )中,动态申请数据存在于( 堆)中。

     

            extern全局变量(用extern修饰的变量只是说明该变量在其他地方定义,所以在其他地方一定要用明确的定义如int a,并且不能用static修饰)、static全局变量和static局部变量的生存期都是“永久”,区别只是可见域不同。extern全局变量可见区域是工程,static全局变量可见区域是文件,而static局部变量的可见区域是块。


    一些要点:

            从代码维护角度来看,对extern变量的修改可能会影响所有代码,对static全局变量的修改可能影响一个文件中的代码,而对static变量的修改可能影响一个块的代码;因此在选择变量类型时,优先级是static局部>static全局>extern全局。但它们有着共同的缺点:使用了这些类型变量的函数将是不可重入的,不是线程安全的。在C/C++标准库中有很多函数都使用了static局部变量,目前的实现中都为它们提供了两套代码,单线程版本使用static变量而多线程版本使用“线程全局变量”,比如rand,strtok等。

     

             一个进程可用内存空间为4G,可分在存放静态数据,代码,系统内存,堆,栈等。.活动记录一般存放调用参数、返回地址等内容。堆和栈最大的区别在于堆是由低地址向高地址分配内存,而栈是由高向低。全局和静态数据存放在全局数据区,其余的在栈中,用mallocnew分配的内存位于堆中。一般来说栈在低地址,堆位于高地址。

    展开全文
  • 3 从分配内存空间看static全局变量和普通全局变量区别:区别: 1.static全局变量编译是初始化,main()函数之前初始化并且仅初始化一次;  2.static全局变量限定了作用范围,仅定义该变量的源文件中有效,由于...

    几者的区别从三个方面考虑:
    1初始化时间
    2 作用域
    3 分配内存空间

    static全局变量和普通全局变量区别:

    区别:

      1.static全局变量编译是初始化,在main()函数之前初始化并且仅初始化一次;
      2.static全局变量限定了作用范围,仅在定义该变量的源文件中有效,由于静态全局变量的作用域局限于一个源文件内,即文件作用域,只能为该源文件内的函数公用, 因此可以避免在其它源文件中引起错误。全局变量可以跨越多个源文件有效,当然,其他不包含全局变量定义的源文件需要用extern关键字再次声明这个全局变量

    相同点:都是全局作用域,静态存储方式

    static局部变量和普通局部变量区别:

    区别

      1.static局部变量只被初始化一次,自从第一次被初始化直到程序运行结束都一直存在。普通局部变量,只在函数执行期间存在,函数的一次调用执行结束后,变量被撤销,其所占用的内存也被收回。
      2.静态局部变量在静态存储区分配空间,局部变量在栈里分配空间。

    相同点:两者都只有局部作用域

    static函数和普通函数区别:

    区别

      1.普通函数的定义和声明默认情况下是extern的,但静态函数只是在声明他的文件当中可见,不能被其他文件所用。好处:其他文件中可以定义相同名字的函数,不会发生冲突。
      2.普通函数在C++类中编译后带一个隐藏的this参数,而static函数不带。

    相同的

    全局变量、静态全局变量以及静态局部变量都会被放在程序的静态数据存储区(全局可见)中,这样可以在下一次调用的时候还可以保持原来的赋值。这一点是它们与堆变量、堆变量的区别。
    而局部变量在栈里分配空间
    从以上分析可以看出,把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。因此static这个说明符在不同的地方所起的作用是不同的。应予以注意。

    展开全文
  • static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别? 答: 1) 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量全局变量本身...
    static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别?   
    答:
    1) 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。这两者的区别在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用, 因此可以避免在其它源文件中引起错误。   
    2) 从以上分析可以看出, 把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。                  
    3) static函数与普通函数作用域不同,仅在本文件。只在当前源文件中使用的函数应该说明为内部函数(static),内部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件   
    综上所述:
    static全局变量与普通的全局变量有什么区别:
    static全局变量只初使化一次,防止在其他文件单元中被引用;   
    static局部变量和普通局部变量有什么区别:
    static局部变量只被初始化一次,下一次依据上一次结果值;   
    static函数与普通函数有什么区别:

    static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝





    全局变量与静态变量

    static 声明的变量在C语言中有两方面的特征:
    1.变量被放在程序的全局存储区中,这样在下一次调用的时候还可以保持原来的赋值。这一点是它与堆栈变量和堆变量的区别。
    2.变量用static告知编译器,自己仅在变量的作用范围内可见。这一点是它与全局变量的区别。
    Tips:
    A.若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度;
    B.若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度;
    C.设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑重入问题;
    D.如果我们需要一个可重入的函数,那么,我们一定要避免函数中使用static变量(这样的函数被称为:带“内部存储器”功能的的函数)
    E.函数中必须要使用static变量的情况:比如当某函数的返回值为指针类型时,则必须是static的局部变量的地址作为返回值,若为auto类型,则返回为错指针。

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

    扩展分析:术语static有着不寻常的历史。起初,在C中引入关键字static是为了表示退出一个块后仍然存在的局部变量。随后,static在C中有了第二种含义:用来表示不能被其它文件访问的全局变量和函数。最后,C++重用了这个关键字,并赋予它与前面不同的第三种含义:表示属于一个类而不是属于此类的任何特定对象的变量和函数(与Java中此关键字的含义相同)。

    全局变量、静态全局变量、静态局部变量和局部变量的区别

    变量可以分为:全局变量、静态全局变量、静态局部变量和局部变量。

    按存储区域分,全局变量、静态全局变量和静态局部变量都存放在内存的静态存储区域,局部变量存放在内存的栈区。

    按作用域分,全局变量在整个工程文件内都有效;静态全局变量只在定义它的文件内有效;静态局部变量只在定义它的函数内有效,并且程序仅分配一次内存,函数返回后,该变量不会消失;局部变量在定义它的函数内有效,但是函数返回后失效。

    全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。
    从以上分析可以看出,把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。

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

    static全局变量与普通的全局变量有什么区别:static全局变量只初使化一次,防止在其他文件单元中被引用;
    static局部变量和普通局部变量有什么区别:static局部变量只被初始化一次,下一次依据上一次结果值;
    static函数与普通函数有什么区别:static函数与普通函数作用域不同,只在定义该变量的源文件内有效;

    全局变量和静态变量如果没有手工初始化,则由编译器初始化为0。局部变量的值不可知。



    人生是一场永不止息的旅行,我们被人海裹挟着向前,不能回头,走过的路,说过话,做过的事,无论对错,也再无更改的可能。——陈寻

    展开全文
  • 全局变量 const常量 static

    千次阅读 2017-06-05 21:20:05
    1. 全局变量、const和extern: 如果const对象编译时可以确定其值,可以将其放在头文件中定义。这样做的原因是 const对象默认情况下是定义该变量的所在文件的局部变量,这样即使次头文件被多个包含,都不会包含...

    1. 全局变量、const和extern:

    如果const对象在编译时可以确定其值,可以将其放在头文件中定义。这样做的原因是 const对象默认情况下是定义该变量的所在文件的局部变量,这样即使次头文件被多个包含,都不会在包含这些文件中重复定义此变量,所有对于这个const对象的引用全部指向在头文件中定义的对象。但是如果在const对象定义的时候声明extern,const对象就变得和普通非const对象一样,从而失去此特性,因为非const对象的默认属性为extern。这种情况下用extern 声明的const变量就不可以在头文件中定义,因为这个变量可以在别的文件中被extern包含使用,所以有可能重复定义。



    假设我们在文件1.cpp中定义了一个全局变量bufsize,文件1.cpp中当然可以访问它,如果我想在另外一个文件2.cpp中访问这个全局变量,这时候需要在文件2.cpp中声明这个变量。

    //1.cpp

    int bufsize;

    //2.cpp

    extern int bufsize;

    这说的是非const的全局变量,如果是const的全局变量,如果想要被其他文件访问,需要在定义的时候,加上extern关键字,表示它可以在其他文件被声明使用的,即可以被整个程序(一个程序可能包括多个源文件)访问,否则的话,这个变量只能在它被定义的文件里面被访问,其他文件不能访问。

    //1.cpp

    extern const int bufsize=10;

    //2.cpp

    extern const int bufsize;

    这时候你也许会问,为什么非const变量定义的时候为什么没有extern?

    答:非const变量默认为extern, const变量默认为文件的局部变量    。而const变量如果想要在其他文件里被访问,必须显示的指定它为extern。

    2.全局变量、static:

    在c++中关键字extern是声明一个变量却不定义它,即不给它一个存储空间。意义是“通过extern关键字扩展全局变量 x的作用范围(即扩展到包含该文件的文件中)”。并不是所欲的变量都能用extern声明,只有全局变量并且没有被static声明的变量才能声明为extern。所以如果不想自己源文件中全局的变量被其他文件引用,可以给变量加上static声明。


    静态变量或静态函数只有本文件内的代码才能访问它,它的名字在其它文件中不可见。


    在c++中,const限定符对默认存储类型稍有影响。在默认情况下,全局变量的链接性为外部的,也就是说在别的文件中也可以使用;但是const类型的全局变量的链接性为内部的,也就是说const类型的全局变量值在本文件内是可见的,别的文件不可以使用,因此,全局const定义就像使用了static说明符一样。


    因此,可以将 const 常量定义在头文件中供工程中的多个其它文件包含引用,并且编译时不会产生变量重复定义的错误。当然,也可以用 #define 宏定义。


    关于const类型的具体解析可以查看这个网址http://blog.csdn.net/Eric_Jo/article/details/4138548


    3. 头文件应用于声明而不是用于定义。

    这并不是一个硬性规定,比如有时候const变量可以在头文件中定义。但是如果在头文件中定义变量,而该头文件又被多次包含的话,会造成变量的重新定义。即使使用预处理器避免多重包含,这里的多重包含指的是同一个文件直接或者间接包含一个头文件多次。而需要注意的是,避免多重包含的措施只能避免该头文件在同一个编译单元内被包含一次,在不同编译单元内还是会被多次包含的,这样就造成了变量的重复定义。


    4. 宏定义和const

    http://blog.csdn.net/potato512/article/details/51454329


    5. 关于各种存储区域比较好的解释

    http://blog.csdn.net/u013765220/article/details/53063698

    展开全文
  • 通常情况下,如果有两个同名变量,一个是普通全局变量,另一个是普通局部变量,那么局部变量其作用域内具有较高的优先权,它将屏蔽全局变量。 #include #include int count = 1; sing namespace std; int fun...
  • static全局变量与普通的全局变量

    万次阅读 多人点赞 2018-03-12 21:58:59
    一、程序的内存分配一个由C/C++编译的程序占用的内存分为以下几个部分:1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等...3、全局区(静态区)(static)— 全局变量和静态变量的存...
  • 前面:花了近2个小时,就为了弄懂一下Objective-C中的全局变量static静态全局变量的区别,好吧,程序猿没有废话,开门见山。首先,网上查了一下全局变量和静态全局变量的总结,觉得这个总结不错:全局变量与...
  • static 全局变量和普通全局变量

    千次阅读 2013-04-22 17:49:30
    静态全局变量限制了他的作用域(非静态全局变量在整个源文件中都是有效的)即只定义该变量的源文件内有效,同一源程序的其他源文件不能访问。 static 全局变量和普通全局变量 static 全局变量和普通全局变量 ...
  • 全局变量的说明之前再冠以static就构成了静态的全局变量。 从存储方式上来说: 非静态全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。这两者存储方式上并无不同。 从作用域上来说: 非静态...
  • 首先了解一下内存的分布图: 代码区 全局数据区 堆区 栈区 代码区:存储代码 全局数据区:static 数据, 全局变量, const常量 堆区:由程序员自己new出来的动态数据, 需要手动释放。...首先总结static全局变量...
  • static全局变量

    2017-09-06 21:39:27
    普通的全局变量也称外部变量,一个程序工程中,全局变量是整个工程都可见的,也就是说只需要工程内的某一个文件内定义全局变量一次,其他文件内都是可见的。而static全局变量的作用域仅限于所在文件内部,工程...
  • static全局变量与普通全局变量有什么区别?...这两者存储方式上并无不同,这两者的区别虽在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文...
  • 普通全局变量前面加上static 就成了static全局变量,他们的存储方式都是一样,存在静态存储方式。区别在于作用范围,普通全局变量作用域是整个源程序,当一个程序有多个源文件组成时候,普通全局变量在每个源文件...
  • 全局变量的使用条件是,.cpp文件中定义并初始化,添加格式如下: .cpp文件中添加: int g_nvalue = 9; 使用时,并不需要添加什么头文件,直接要使用全局变量的.cpp中声明: extern int g_nvalue; 然后就...
  • 全局变量static的用法

    千次阅读 2018-12-19 21:27:17
    1.全局变量函数和类外的定义的变量,具有全局的作用域,作用范围从定义点起到文件结束为止。(除非作用域被当前同名作用域覆,即使用最近定义) 例如: 输出结果: 此时输出的a=4,而不是全局的123; ...
  • 1. static全局变量与普通的全局变量有什么区别 ? 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。 这两者存储方式上并无...
  • 有区别的,而且和链接器(linker)有关。未加static的变量可以被其他的编译单元...的确,定义全局变量就可以实现变量文件中的共享,但定义静态全局变量还有以下好处: 静态全局变量不能被其它文件所用; 其它文件中可
  • 1、static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别?  答:全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量全局变量...
  • 全局变量(外部变量)的说明之前再冠以static就构成了静态的全局变量全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。  这两者存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用...
  • static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别? 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量全局变量本身就是...
  • Static全局变量与普通的全局变量有什么区别? 答:  全局变量(外部变量)的说明之前再冠以static就构成了静态的全局变量全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。 这两者存储方式上...
  • static 变量 全局变量

    千次阅读 2009-07-30 16:39:00
    用于全局变量,主要作用是限制此全局变量被其他的文件调用. 3. 用于类中的成员.表示这个成员是属于这个类但是不属于类中任意特定对象 1. 静态局部变量静态局部变量属于静态存储方式,它具有以下特点: (1)静态局部...
  • 局部变量和全局变量,extern和static

    千次阅读 2016-07-24 19:34:59
    局部变量和全局变量,extern和static
  • C/C++ static全局变量static局部变量

    千次阅读 2015-04-02 09:42:51
    1.static全局变量不能被其他源文件通过extern进行引用访问。 2.static局部变量的值函数执行完毕,仍然可以保留下来。
  • 全局变量static变量初始化时间

    千次阅读 2019-04-24 22:04:41
    首先,静态局部变量和全局变量一样,数据都存放全局区域,所以主程序之前,编译器已经为其分配好了内存,但C和C++中静态局部变量的初始化节点又有点不太一样。C中,初始化发生代码执行之前,编译阶段分配...
  • static/静态全局变量作用域有限,局限一个源文件内(定义它的源文件),不能被同一源程序的其他源文件使用,避免引起错误。(因而同名静态全局变量可以被定义不同源文件中,使用关键字static) 普通全局变量...
  • 菜鸟在线C编译器:1)或2)  1. http://www.compileonline.com/compile_c_online.php  2....amp;type=c ...1.static全局变量只初使化一次,防止其他文件单元中被引用; 2.static局部变量只被...
  • 使用static修饰头文件中修饰的变量,此时不会产生冲突(用static修饰的全局变量的作用域为定义的源文件),多个源文件中引用该头文件,等于是每个源文件中都定义了该变量一次,而且此变量仅本源文件中有效,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 325,017
精华内容 130,006
关键字:

在所有全局变量前加static