精华内容
下载资源
问答
  • static全局变量
    千次阅读
    2020-01-01 12:53:13

    全局变量本身是静态存储方式,静态全局变量也是静态存储方式。 两者在存储方式上没有不同。

    区别在于:

    非静态全局变量的作用域是整个源程序,一个非静态的全局变量在各个源文件中都是有效的.静态全局变量限制作用域,仅仅在定义该变量的源文件中有效,同一源程序的其他源文件不能使用它.

    由于静态全局变量的作用域局限于一个源文件内,因此可以避免在其他源文件中引起错误

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

    总结:

    static全局变量与普通全局变量的区别是:static全局变量只初始化一次,防止在其他文件中被引用

    static局部变量与普通局部变量的区别是:static局部变量只被初始化一次,下一次一局上一次结果值

    static函数与普通函数的区别是:static函数在内存中只有一份,普通函数在每个被调用中维持一份复制品.

    更多相关内容
  • 以下是对static全局变量与普通的全局变量的区别进行了详细的分析介绍,需要的朋友可以过来参考下,希望对大家有所帮助
  • 普通局部变量static局部变量: 1、 ① static局部变量在编译阶段就已经分配内存空间了,也就是函数没有调用前它就已经存在了。 ② 普通局部变量只有运行到定义该变量的时候才会分配内存空间。 2、 ① 当执行完...

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


    1、
    ① static局部变量在编译阶段就已经分配内存空间了,也就是函数没有调用前它就已经存在了。
    ② 普通局部变量只有运行到定义该变量的时候才会分配内存空间。
     

    2、
    ① 当执行完定义该static局部变量的函数体后,该static变量的内存空间不会被释放,只有程序结束时static变量才会自动释放。
    ② 当执行完定义该普通局部变量的函数体后,该普通局部变量的内存空间就会被释放。
     

    3、
    ① 如果static局部变量不初始化,那么它默认为0。
    ② 如果普通局部变量不初始化,那么它的值为随机数。
     

    4、
    ① static局部变量的初始化语句只会执行一次,下次再运行该初始化语句就不会被初始化,但是它可以被多次赋值。
    ② 每次运行该普通局部变量的定义时该变量都会被初始化。
     

    5、static变量是存放在Data区的,该区只有程序结束时才会被释放。

    为什么static变量只能被常量赋值,而不能被变量赋值?
    例如:
    int a = 10;
    static int b = a;
    这样会报错,变量不能给static变量赋值,因为static变量是存放在Data区,它在程序编译阶段就在Data区了,但是普通变量只有在程序运行到初始化的时候才会被分配内存空间,所以static变量在编译阶段被没有初始化分配内存空间的普通变量赋值是错误的,只能用常量赋值。

     


    普通全局变量:


    1、在函数外面定义的变量为全局变量,任何地方都可以使用全局变量。

    2、在使用全局变量时,如果在前面找不到该全局变量的定义,必须在前面进行声明才可以使用该全局变量,使用extern声明,而且extern声明只针对全局变量,不能使用在局部变量。

    3、如果全局变量不初始化,那么默认赋值为0。

    4、全局变量只能定义一次,但可以声明多次。

    5、全局变量在编译阶段已经分配了内存空间,即函数没有执行前,只有在整个程序结束后才会自动释放内存空间(和static变量类似)。

    6、普通全局变量的定义和声明:
    ① 定义一个全局变量并初始化:
    int num = 100;
    ② 如果要声明一个全局变量,需要加extern:
    extern int num;

     


    static全局变量:


    1、static全局变量和普通全局变量的区别就在于文件作用域的不同,static全局变量只能在定义的文件内使用,其它文件是不能使用的,而普通全局变量在所有文件都能使用,前提是需要声明。

    2、extern关键字只适用于普通全局变量,不能跟static一起使用。

    3、不同文件定义的static全局变量即使名字一样,也是不会有影响的,因为它们是没有关系的。

    展开全文
  • static全局变量与普通的全局变量

    万次阅读 多人点赞 2018-03-12 21:58:59
    一、程序的内存分配一个由C/C++编译的程序占用的内存分为以下几个部分:1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等...3、全局区(静态区)(static)— 全局变量和静态变量的存...

    一、程序的内存分配

    一个由C/C++编译的程序占用的内存分为以下几个部分:

    1栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。

    2堆区(heap — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。

    3、全局区(静态区)(static)— 全局变量静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后有系统释放

    4、文字常量区 — 常量字符串就是放在这里的。 程序结束后由系统释放。

    5、程序代码区 — 存放函数体的二进制代码。

     在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态 

    存储区和常量存储区。  

    (1),就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量 的存储区。里面的变量通常是局部变量、函数参数等。  

    (2),就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉, 那么在程序结束后,操作系统会自动回收。  

    (3)自由存储区,就是那些由malloc等分配的内存块,他和堆是十分相似的, 不过它是用free来结束自己的生命的。  

    (4)全局/静态存储区全局变量静态变量被分配到同一块内存中,在以前的 C语言中,全局变量又分为初始化的和未初始化的(初始化的全局变量和静态变量在一块区域,未初始化的全局变量与静态变量在相邻的另一块区域,同时未被初始化的对象存储区可以通过void*来访问和操纵,程序结束后由系统自行释 放),在C++里面没有这个区分了,他们共同占用同一块内存区。  

    (5)常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许 修改(当然,你要通过非正当手段也可以修改,而且方法很多)  

    举一个例子:  
        void f() { int* p=new int[5]; }   
        这条短短的一句话就包含了堆与栈,看到new,我们首先就应该想到,我们分配了一块堆内存,那么指针p呢?他分配的是一块栈内存,所以这句话的意思就是:在栈内存中存放了一个指向一块堆内存的指针p。在程序会先确定在堆中分配内存的大小,然后调用operator new分配内存,然后返回这块内存的首地址,放入栈中 。

    堆是向高地址位扩展,而栈是向低地址位扩展:

    int main()
    {
    	int *i = new int(5);
    	int *j = new int(6);
    	int a = 5;
    	int b = 6;
    	cout << "i指向的地址:"<<i << endl;
    	cout << "j指向的地址:"<<j << endl;
    	cout << "a的地址:"<<&a << endl;
    	cout << "b的地址:"<<&b << endl;
    	
    	delete i;
    	return 0;
    }

    输出结果是





    指针i指向的对象地址要低于j指向的地址,是向高地址位扩展,所以指针i,j指向的对象存储在堆中。而a,b的地址可以看出,是向低地址位扩展,所以a,b是存储在栈中。

    二、例子程序

     //main.cpp

     int a = 0; 全局初始化区

     char *p1; 全局未初始化区

     main()

     {

     int b;// 

     char s[] = "abc"; //

     char *p2; //

     char *p3 = "123456"; 123456\0";//在常量区,p3在栈上。

     static int c =0 //全局(静态)初始化区

     p1 = (char *)malloc(10);

     p2 = (char *)malloc(20);//分配得来得10和20字节的区域就在自由存储区。

     strcpy(p1, "123456"); //123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。

     }

    三、从作用域看:

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

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

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

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

    从分配内存空间看:
    全局变量,静态局部变量,静态全局变量都在静态存储区分配空间,而局部变量在栈里分配空间。

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

    四、总的来说就是:

    1、生存周期不同
    2
    、作用范围不同
    3、分配方式不同

    ----------------------------------------------

    再来看下堆和栈的不同:

    1、分配方式不同;
    2
    、空间大小不同;
    3、分配效率不同;
    4、能否产生碎片不同;
    5、生长方向不同;

    1分配方式不同

    栈:
    由系统自动分配。 例如,声明在函数中一个局部变量 int b; 系统自动在栈中为b开辟空间
    堆:
    需要程序员自己申请,并指明大小,在c中malloc函数
    如p1 = (char *)malloc(10);
    在C++中用new运算符
    如p2 = (char *)new(10);
    但是注意p1、p2本身是在栈中的。 

    2、 空间大小不同

    一般来讲在32
    位系统下,堆内存可以达到4G的空间,从这个角度来看堆内存几乎是没有什么限制的。但是对于栈来讲,一般都是有一定的空间大小的,例如,在VC6下面,默认的栈空间大小是1M。

    3、分配效率

    栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执 行,这就决定了栈的效率比较高。堆则是C/C++函数库提供的,它的机制是很复杂的,例如为了分配一块内存,库函数会按照一定的算法(具体的算法可以参考 数据结构/操作系统)在堆内存中搜索可用的足够大小的空间,如果没有足够大小的空间(可能是由于内存碎片太多),就有可能调用系统功能去增加程序数据段的内存空间,这样就有机会分到足够大小的内存,然后进行返回。显然,堆的效率比栈要低得多。

    4、碎片问题

    栈:只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出。 
    堆:首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时, 
    会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序,另外,对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小,这样,代码中的delete语句才能正确的释放本内存空间。另外,由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动的将多余的那部分重新放入空闲链表中。 

    对于堆来讲,频繁的new/delete势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低。对于栈来讲,则不会存在这个问题,因为栈是先进后出的队列,他们是如此的一一对应,以至于永远都不可能有一个内存块从栈中间弹出,在他弹出之前,在他上面的后进的栈内容已经被弹出。

    5、生长方向 

    对于堆来讲,生长方向是向上的,也就是向着内存地址增加的方向;对于栈来讲,它的生长方向是向下的,是向着内存地址减小的方向增长。 


    堆和栈相比,由于大量new/delete的使用,容易造成大量的内存碎片;由于没有专门的系统支持,效率很低;由于可能引发用户态和核心态的切换,内存的申请,代价变得更加昂贵。所以栈在程序中是应用最广泛的,就算是函数的调用也利用栈去完成,函数调用过程中的参数,返回地址,EBP和局部变量都采用栈的方式存放。所以,我们推荐大家尽量用栈,而不是用堆。虽然栈有如此众多的好处,但是由于和堆相比不是那么灵活,有时候分配大量的内存空间,还是用堆好一些。 


    static函数与普通函数有什么区别

     用static修饰的函数,本限定在本源码文件中,不能被本源码文件以外的代码文件调用。而普通的函数,默认是extern的,也就是说,可以被其它代码文件调用该函数。
      在函数的返回类型前加上关键字static,函数就被定义成为静态函数。普通 函数的定义和声明默认情况下是extern的,但静态函数只是在声明他的文件当中可见,不能被其他文件所用。因此定义静态函数有以下好处:
      <1> 其他文件中可以定义相同名字的函数,不会发生冲突。
      <2> 静态函数不能被其他文件所用。


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

    展开全文
  • 你看上下文来判断1,表示变量是静态存储变量表示变量存放在静态存储区.2,表示该变量是内部连接(这种情况是指该变量不在任何{}之内,就象全局变量那样,这时候加上static),也就是说在其它的.cpp文件中,该变量是不可见的...

    C语言中讲讲static变量和static函数有什么作用

    static关键字有两种意思,你看上下文来判断

    1,表示变量是静态存储变量

    表示变量存放在静态存储区.

    2,表示该变量是内部连接

    (这种情况是指该变量不在任何{}之内,就象全局变量那样,这时候加上static)

    ,也就是说在其它的.cpp文件中,该变量是不可见的(你不能用).

    当static加在函数前面的时候

    表示该函数是内部连接,之在本文件中有效,别的文件中不能应用该函数.

    不加static的函数默认为是全局的.

    也就是说在其他的.cpp中只要申明一下这个函数,就可以使用它.

    1、static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别?

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

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

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

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

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

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

    2、如何引用一个已经定义过的全局变量?

    答:extern

    可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引用某个在头文件中声明的全局变理,假定你将那个变写错了,那么在编译期间 会报错,如果你用extern方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错。

    3、全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么?

    答:可以,在不同的C文件中以static形式来声明同名全局变量。

    可以在不同的C文件中声明同名的全局变量,前提是其中只能有一个C文件中对此变量赋初值,此时连接不会出错。

    posted on 2009-05-29 23:20 Frank_Fang 阅读(17299) 评论(2)  编辑  收藏 所属分类: C++编程

    展开全文
  • Static全局变量与普通的全局变量有什么区别? 答:  全局变量(外部变量)的说明之前再冠以static就构成了静态的全局变量。全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。 这两者在存储方式上...
  • static全局变量和普通全局变量区别?static局部变量和普通局部变量区别?static函数和普通函数区别 原创Isanti2015 最后发布于2017-08-21 20:05:50 阅读数 1288 收藏 展开 几者的区别从三个方面考虑: 1初始化时间 ...
  • C语言中static全局变量与普通的全局变量区别

    万次阅读 多人点赞 2018-12-09 20:54:05
    1. static全局变量与普通的全局变量有什么区别 ?  全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。  全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。 这两者在存储方式...
  • Static全局变量与普通的全局变量有什么区别? 答:  全局变量(外部变量)的说明之前再冠以static就构成了静态的全局变量。全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。 这两者在存储方式上...
  • 全局变量的说明之前再冠以static就构成了静态的全局变量。 从存储方式上来说: 非静态全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。这两者存储方式上并无不同。 从作用域上来说: 非静态...
  • static全局变量与普通全局变量有什么区别?static局部变量与普通局部变量有什么区别?总结static 的用法! 答:全局变量(外部变量)的说明之前再冠以static就构成了静态的全局变量。全局变量本身就是静态存储方式,...
  • 首先了解一下内存的分布图: 代码区 全局数据区 堆区 栈区 代码区:存储代码 全局数据区:static 数据, 全局变量, const常量 堆区:由程序员自己new出来的动态数据, 需要手动释放。...首先总结static全局变量...
  • 1、static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别?  答:全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量...
  • 1.全局变量 全局变量的使用条件是,在.cpp文件中定义并初始化,添加格式如下: .cpp文件中添加: int g_nvalue = 9; 使用时,并不需要添加什么头文件,直接在要使用全局变量的.cpp中声明: extern int g_...
  • 菜鸟在线C编译器:1)或2)  1. http://www.compileonline.com/compile_c_online.php  2....amp;type=c ...1.static全局变量只初使化一次,防止在其他文件单元中被引用; 2.static局部变量只被...
  • static变量与全局变量

    千次阅读 2019-11-07 20:44:25
    一、程序的内存分配 一个由C/C++编译的程序占用的内存分为以下几个部分: 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的...
  • static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别? 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是...
  • C语言中 static 的用法全局变量与局部变量 1. 什么是static? static 是 C语言中很常用的修饰符,它被用来控制变量的存储方式和可见性。 1.1 static 的引入 在函数内部定义的变量,当程序执行到它的定义处时,编译器...
  • static全局变量

    千次阅读 2017-09-06 21:39:27
    普通的全局变量也称外部变量,在一个程序工程中,全局变量是整个工程都可见的,也就是说只需要在工程内的某一个文件内定义全局变量一次,在其他...而static全局变量的作用域仅限于所在文件内部,工程内的其他文件不可见
  • .h文件中的全局变量用了static修饰,但被其它文件包含后,这个static全局变量还是可以被其它文件访问,那我声明为static有什么意义? 怎样才能让我的头文件在被其它文件包含后其中的全局变量不被这个文件访问到?
  • 静态变量static全局变量global

    千次阅读 2021-03-04 05:42:25
    静态变量static ,全局变量global静态变量在java也叫类变量从名字可以看出它是属于某个类的而不是类的实例。它的关键字是static存储在静态存储区,当程序执行,类的代码被加载到内存,类的静态变量就分配了内存空间,...
  • static全局变量:相当于全局变量,但只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它,而extern全局变量可以。 static局部变量:只在定义的函数体内有效,第一次定义时初始化,后续再次进入子...
  • 如题如题如题如题如题如题如题如题如题如题如题如题如题如题如题
  • C/C++ 中 static 的用法全局变量与局部变量 1. 什么是static? static 是 C/C++ 中很常用的修饰符,它被用来控制变量的存储方式和可见性。 1.1 static 的引入 我们知道在函数内部定义的变量,当程序执行到它的...
  • 1:static 定义的全局变量 只能在这个文件中使用。 2:static函数中 只能使用static定义的变量

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 374,991
精华内容 149,996
关键字:

static全局变量

友情链接: FeedingFish.zip