精华内容
下载资源
问答
  • 外部变量和静态变量

    千次阅读 2013-12-05 20:08:31
    编译时将外部变量分配在静态存储区。有时需要在其他文件中使用extern来声明外部变量,以扩展外部变量的作用域。 也可用static声明外部变量,使该变量不能被其他文件引用。 2.用extern声明外部

    外部变量

    1.简介

                外部变量是在函数外部定义的全局变量,它的作用域是从变量的定义处开始,到本程序文件的结尾。在此作用域内,全局变量可为各个函数所引用。编译时将外部变量分配在静态存储区。有时需要在其他文件中使用extern来声明外部变量,以扩展外部变量的作用域。 也可用static声明外部变量,使该变量不能被其他文件引用。

    2.用extern声明外部变量

    extern可省略不写。
    本文件里:在一个文件里,有不止一个函数,外部变量在第一个函数前面定义。若用extern在第一个函数前声明该变量则该变量可以在第一个函数中使用。
    多个文件中:在其他文件中若想要使用该文件中已声明的全局变量,则在其他文件头部声明该变量,即可使用该全局变量。

    3.用static声明外部变量

    static声明后该外部变量就只能在本文件中使用。

    静态变量

    静态变量的类型关键字是static。 静态变量当然是属于静态存储方式,但是属于静态存储方式的量不一定就是静态变量, 例如外部变量虽属于静态存储方式,但不一定是静态变量,必须由 static加以定义后才能成为静态外部变量,或称静态全局变量。 对于自动变量,它属于动态存储方式。 但是也可以用static定义它为静态自动变量,或称静态局部变量,从而成为静态存储方式。 由此看来,一个变量可由static进行再说明,并改变其原有的存储方式。(区分静态全局变量与静态局部变量)

    1.概念定义

    “静态变量”这一术语有两个容易混淆的定义:

    静态全局变量和静态局部变量有不同的生存周期,静态局部变量的生存期与整个源程序相同,静态全局变量的生存期值存在于一个源文件内。

    2.常量使用

    静态变量也可以用于存储常数。具体来说,静态变量(全局变量及汇编语言里定义的符号亦同)可用const,constant或final(根据语言决定)等关键字标识,这时其值就会在编译时(英语:Compile time)设定,并且无法在运行时改变。编译器通常将静态常量与文本一起置于目标文件的文本区域,而非常量初始化数据则置于数据区;而如若有需要,有些编译器还可选择为其开辟专用区;为防止常数变量被错误的指针写入覆盖,亦可在这块区域启用内存保护机制。

    3.变量特点

    静态局部变量

    静态局部变量属于静态存储方式,它具有以下特点:
    (1)静态局部变量在函数内定义,但不像自动变量那样,当调用时就存在,退出函数时就消失。静态局部变量始终存在着,也就是说它的生存期为整个源程序。
    (2)静态局部变量的生存期虽然为整个源程序,但是其作用域仍与自动变量相同,即只能在定义该变量的函数内使用该变量。退出该函数后, 尽管该变量还继续存在,但不能使用它。
    (3)允许对构造类静态局部量赋初值。若未赋以初值,则由系统自动赋值。数值型变量自动赋初值0,字符型变量赋空字符。
    (4)对基本类型的静态局部变量若在说明时未赋以初值,则系统自动赋予0值。而对自动变量不赋初值,则其值是不定的。 根据静态局部变量的特点, 可以看出它是一种生存期为整个源文件的量。虽然离开定义它的函数后不能使用,但如再次调用定义它的函数时,它又可继续使用, 而且保存了前次被调用后留下的值。 因此,当多次调用一个函数且要求在调用之间保留某些变量的值时,可考虑采用静态局部变量。虽然用全局变量也可以达到上述目的,但全局变量有时会造成意外的副作用,因此仍以采用局部静态变量为宜。
    举例说明:

    区别静态局部变量和动态局部变量

    #include<stdio.h>
    int fun(int n)
    {
        static int f= 1;
        f=f*n;
        return f;
    }
    void main()
    {
        int i;
        for(i =1;i <=5;i++)
            printf("fun(%d) = %d\n" , i , fun(i));
    }
    
    运行结果:

    fun(1) = 1
    fun(2) = 2
    fun(3) = 6
    fun(4) = 24
    fun(5) = 120
    

    静态全局变量

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

    不同作用

    除明确标识出变量的生命周期英语:Object lifetime)外,将变量声明为static存储类还会根据变量属性不同而有一些特殊的作用:
    对于静态全局变量来说,针对某一源文件的以static声明的文件级变量与函数的作用域只限于文件内(只在文件内可见),也即“内部连接”,因而可以用来限定变量的作用域
    对于静态局部变量来说,在函数内以static声明的变量虽然与自动局部变量的作用域相同(即作用域都只限于函数内),但存储空间是以静态分配而非默认的自动分配方式获取的,因而存储空间所在区域不同(一般来说,静态分配时存储空间于编译时在程序数据段分配,一次分配全程有效;而自动分配时存储空间则是于调用栈上分配,只在调用时分配与释放),且两次调用间变量值始终保持一致;
    对于静态成员变量英语:Member variable)来说,在C++中,在类的定义中以static声明的成员变量属于类变量英语Class variable),也即在所有类实例中共享,与之相对的就是过程变量英语Instance variable)。

    展开全文
  • 区分静态变量、动态变量、内部变量(局部变量)、外部变量(全局变量)静态变量、动态变量、内部变量(局部变量)、外部变量(全局变量)变量的分类来看 静态变量、动态变量、内部变量(局部变量)、外部变量(全局...

    区分静态变量、动态变量、内部变量(局部变量)、外部变量(全局变量)

    静态变量、动态变量、内部变量(局部变量)、外部变量(全局变量)

    文章参考:https://blog.csdn.net/21aspnet/article/details/2560072
    文章参考:https://blog.csdn.net/u013921430/article/details/79279114

    变量的分类来看

    变量分类

    1. 作用域分类
      局部变量(默认是自动局部变量)
      1. 定义:在一个函数内部定义的变量(包括函数形参)
      2. 有效范围:一直在本函数有效
      3. 变量存储:栈内存,函数结束之后自动销毁
      4. 静态局部变量:存储在静态存储区,作用域依旧在函数体内部。每次对其修改都会被保存下来。
      ** 全局变量 **
      1. 定义:在函数外部定义的变量,可为本源文件中其他函数使用
      2. 有效范围:从定义变量的位置开始到本源文件的结束
      3. 变量存储:存储在静态存储区域(静态内存)
      4. 可被工程项目其他文件的 extern 声明之后调用,对其每次修改都会进行保存
      5. 静态全局变量:不能被其他源文件使用,只能本源文件使用,并且每次修改会被保存
    2. 生存周期分类
      静态存储方式——程序运行期间分配固定的存储空间的方式
      动态存储方式——程序运行期间根据需要进行的动态分配空间的方式
      又可分为
      1. auto(自动)——默认,数据存储在动态存储
      2. static(静态)——函数在调用结束之后会保存本次调用的数值
      3. register(寄存器)——在声明动态局部变量或者函数形参时,可将变量声明为register,这样编译系统就会为变量分配一个寄存器而不是内存空间,通过这种方式可提升对某些局部变量频繁调用的程序的性能。(寄存器运算速度远高于内存)
      4. extern (外部)——扩展全局变量的作用域
    展开全文
  • 外部静态变量 内部静态变量 全局变量 作用域 只在定义它的源文件有效,同一程序的其他源文件不能使用 所在源文件,局部可用(所定义的{}内有效) ...



    外部静态变量

    内部静态变量

    全局变量

    作用域

    只在定义它的源文件有效,同一程序的其他源文件不能使用

    所在源文件,局部可用(所定义的{}内有效)

    默认为所在源文件;若其他文件需要使用,用extern声明

    生命期

    从定义到程序结束

    从定义到程序结束

    从定义到程序结束

    初始化

    自动赋值为0

    自动赋值为0

    自动赋值为0

    注意:

    1)在include头文件时,只需要当成将头文件中的代码放到引用文件中,同时,一个类的一个方法只有一份内存,与Java中相同。

    2)所有未加static前缀的全局变量和函数都具有全局可见性,其它的源文件也能访问,如果加了static,就会对其它源文件隐藏。

    转载于:https://www.cnblogs.com/ok-lanyan/archive/2012/08/07/2627250.html

    展开全文
  • 静态变量外部变量

    2013-03-19 21:37:35
    静态变量的定义是伴随着声明的,也就是说不管在声明的时候有没有对变量进行初始化,静态变量都会进行初始化,缺省值为0;然而外部变量的声明和定义是分开的,并且可以在多个文件中多次声明同一个变量(要注意,外部...

    static和extern是两种可以全局作用的变量。

    在这里,先说明“声明”和“定义”的区别。如果是定义,那么编译器会为该分量分配内存空间,但是对于声明来说则不会分配。

    静态变量的定义是伴随着声明的,也就是说不管在声明的时候有没有对变量进行初始化,静态变量都会进行初始化,缺省值为0;然而外部变量的声明和定义是分开的,并且可以在多个文件中多次声明同一个变量(要注意,外部变量的定义一定要在函数体外进行)。

    ps:当int a放在外部时,它表示的是外部变量而不是静态变量,并且会被默认初始化为0,同静态变量。若无extern,则表示该变量的定义,加了extern则仅仅是声明,不分配内存。

    ps:外部和静态变量都只会被初始化一次,而自动变量和寄存器变量每次进入函数都会被重新初始化一次。

    基本的区别也就这样,以下说明一下全局静态变量和局部静态变量。

    对于局部静态变量,它的作用域在函数块内,块外不能访问,但是生命周期直到整个程序的结束(个人认为静态局部变量的好处在于避免了放在块外被不小心修改的可能)。而全局静态变量,它的作用域在于整个文件的结束,这里再提一下和extern的区别,extern在整个程序中都可以被访问,只要在所在的文件内重新声明即可使用,而全局静态变量只局限在自己的文件内。

    展开全文
  • C++:外部变量和静态变量

    千次阅读 2018-03-21 19:38:06
    外部变量的定义和声明是不同的。外部变量的定义只能有一次,它的位置在所有函数之外,而统一文件中的外部变量的声明可以有多次,它的位置可以在函数之内,也可以在函数之外。 系统根据外部变量的定义,而不是声明,...
  • 作用域 全局变量 局部变量 静态变量 外部变量 常量 volatile变量  作用域: 作用域规则告诉我们一个变量的有效范围,它在哪儿创建,在哪儿销毁(也就是说超出了作用域)。变量的有效作用域从它的...
  • 一、静态变量: 在了解静态变量之前,读者需要知道什么是全局变量和局部变量。局部变量直至定义在函数内部的变量,在函数调用结束后,局部变量将消失。全局变量是指在函数体外定义的变量,它的生命期随着程序的结束...
  • 写一个类用来判断是否静态类和非静态类的能不能访问外部静态变量和非静态变量,答案是静态内部类可以访问静态变量,而不可以访问类的非静态内部类。 原因是:当一个静态内部类被使用的时候,它的外部类一定已经...
  • 2.static 静态存贮分配变量(又分为内部静态和外部静态) 3.extern 全程变量(用于外部变量说明) 4.register 寄存器变量(分配在硬件寄存器中) 四大类,所有变量必须先说明(定义),后使用。 ...
  • 静态变量当然是属于静态存储方式,但是属于静态存储方式的量不一定就是静态变量, 例如外部变量虽属于静态存储方式,但不一定是静态变量,必须由 static加以定义后才能成为静态外部变量,或称静态全局变量。...
  • 2.static 静态存贮分配变量(又分为内部静态和外部静态) 3.extern 外部变量/全程变量(用于外部变量说明) 4.register 寄存器变量(分配在硬件寄存器中) 四大类,所有变量必须先说明(定义),...
  • 2.static 静态存贮分配变量(又分为内部静态和外部静态) 3.extern 外部变量/全程变量(用于外部变量说明) 4.register 寄存器变量(分配在硬件寄存器中) 四大类,所有变量必须先说明(定义),...
  • 关于静态局部变量静态外部变量

    千次阅读 2017-11-09 19:14:10
    1:静态局部变量存储在静态存储区,如果赋有初值,函数调用期间只赋值一次,下次调用该函数时,静态局部变量值为上次调用之后的结果,原因:静态局部变量在函数调用期间是不释放的;而自动变量在每次调用函数时都会...
  • 2.static 静态存贮分配变量(又分为内部静态和外部静态) 3.extern 全程变量(用于外部变量说明) 4.register 寄存器变量(分配在硬件寄存器中) 四大类,所有变量必须先说明(定义),后使用。 ...
  • 静态变量当然是属于静态存储方式,但是属于静态存储方式的量不一定就是静态变量,例如外部变量虽属于静态存储方式,但不一定是静态变量,必须由 static加以定义后才能成为静态外部变量,或称静态全局变量。...
  • 静态变量的类型说明符是static,静态变量属于静态存储方式,但属于静态存储方式的不一定是静态变量,如外部变量(全局变量)就属于静态存储方式,但不是静态变量。必须有static加以定义才是静态变量,或静态全局变量...
  • 一、外部函数(定义时默认) 在定义函数时,如果在函数首部的最左端冠以关键字extern,则表示此函数是外部函数,可供其他文件调用。 如果在定义函数时省略extern,则默认为外部函数。 但是,在调用外部函数时,声明...
  • 外部链接的静态变量具有文件作用域、外部链接和静态存储期。 该类别有时称为外部存储类别(external storage class),属于该类别的变量称为外 部变量(external variable)。把变量的定义性声明(defining ...
  • 2.static 静态存贮分配变量(又分为内部静态和外部静态) 3.extern 全程变量(用于外部变量说明) 4.register 寄存器变量(分配在硬件寄存器中) 四大类,所有变量必须先说明(定义),后使用。 ...
  • 今天被问到了一个问题:如何让请求的类延迟释放如果要延迟释放或者在程序整个生命周期都存在可以考虑两种方式,一是定义一个静态变量,二是用单例。用单例本质上用的是静态变量。单例的写法如下:+ (instancetype)...
  • 1全局变量 定义在函数外,不属于任何函数,生存周期为定义开始...3(局部)静态变量 与局部变量类似,只不过其生存周期为定义开始直到程序运行结束。其赋初值只会在函数第一次调用时起作用,若没有赋值,自动赋值为0
  • 静态变量浅析

    千次阅读 2009-02-10 15:12:00
    静态变量有两种:一种是外部静态变量,另一种是内部静态变量。(1)外部静态变量。如果希望在一个文件中定义的外部变量的作用域仅局限于此文件中,而不能被其它文件所访问,则可以在定义此外部变量的类型说明符的...
  • 全局变量是在所有函数体的外部定义的,程序的所有部分(甚至其他文件中的代码)都可以使用.全局变量不受作用哉的影响,...静态变量是指那些本不应该在程序整个生命期里存在的变量可以在程序的整个生命期里存在的变量(如...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,636
精华内容 2,654
关键字:

外部静态变量