精华内容
下载资源
问答
  • 程序的局部变量 全局变量 动态申请数据分别存储什么地方? 量的类别: 根据作用域可分为全局变量和局部变量。 根据生存周期可分为静态存储方式和动态存储方式,具体地又分为自动的(auto)、静态的(static)、...
    程序的局部变量 全局变量 动态申请数据分别存储在什么地方?
    量的类别:
    根据作用域可分为全局变量和局部变量。
    根据生存周期可分为静态存储方式和动态存储方式,具体地又分为自动的(auto)、静态的(static)、寄存器的(register)、外部的(extern)。
    静态存储方式是指在程序运行期间分配固定的存储空间的方式,动态存储方式是在程序运行期间根据需要进行动态的分配存储空间的方式。
    
    每一个变量均有作用域和存储类别两个属性,这些属性共同用于描述一个变量,这些不同类型的变量与存储位置的关系如下:
    外部变量(全局变量)、静态外部变量、静态局部变量存储在静态存储区。
    自动局部变量(局部变量默认为自动局部变量)、函数形参存储在动态存储区,不论是静态存储区还是动态存储区均属于内存中的用户区。
    但是,寄存器变量是存储在CPU寄存器中的而不是内存中。
    
    首先说明一下与作用域相关的几个属性:
    局部变量:在一个函数内部定义的变量是内部变量,它只在本函数范围内有效,也就是说只有在本函数内才能使用它们,在此函数以外是不能使用这些变量的,这种类型的变量就称为“局部变量”。
    全局变量:在函数外定义的变量,可以为本源文件中其它函数所公用,有效范围为从定义变量的位置开始到本源文件结束,这种类型的变量就称为“全局变量”。
    
    接下来说明一下与存储类型相关的几个属性:
    atuo:在声明局部变量时,若不指定 static,默认均是 auto,这类变量都是动态分配存储空间的,数据存储在动态存储区中。
    static:在声明局部变量时,使用关键字 static 将局部变量指定为“静态局部变量”,这样在函数调用结束后不消失而保留原值,即占用的存储单元不释放,在下一次函数调用时,该变量已有值就是上次函数调用结束时的值。
    register:在声明动态局部变量或者函数形参时,可将变量声明为register,这样编译系统就会为变量分配一个寄存器而不是内存空间,通过这种方式可提升对某些局部变量频繁调用的程序的性能。(寄存器运算速度远高于内存)
    extern:用于扩展全局变量的作用域,比如如果函数想引用一个外部变量,但该外部变量在该函数后定义,那么这个函数需要使用 extern 来声明变量,这样才能使用在该函数后面定义的全局变量。此外,extern 还可以在多文件的程序中声明外部变量。
    
    由于变量从不同维度划分,形成了多种错综复杂的关系,在学习编程的时候需要重点关注。

    展开全文
  • 程序的局部变量 全局变量 动态申请数据分别存储什么地方? 量的类别: 根据作用域可分为全局变量和局部变量。 根据生存周期可分为静态存储方式和动态存储方式,具体地又分为自动的(auto)、静态的(static)、...
    程序的局部变量 全局变量 动态申请数据分别存储在什么地方?
    量的类别:
    根据作用域可分为全局变量和局部变量。
    根据生存周期可分为静态存储方式和动态存储方式,具体地又分为自动的(auto)、静态的(static)、寄存器的(register)、外部的(extern)。
    静态存储方式是指在程序运行期间分配固定的存储空间的方式,动态存储方式是在程序运行期间根据需要进行动态的分配存储空间的方式。

    每一个变量均有作用域和存储类别两个属性,这些属性共同用于描述一个变量,这些不同类型的变量与存储位置的关系如下:
    外部变量(全局变量)、静态外部变量、静态局部变量存储在静态存储区。
    自动局部变量(局部变量默认为自动局部变量)、函数形参存储在动态存储区,不论是静态存储区还是动态存储区均属于内存中的用户区。
    但是,寄存器变量是存储在CPU寄存器中的而不是内存中。

    首先说明一下与作用域相关的几个属性:
    局部变量:在一个函数内部定义的变量是内部变量,它只在本函数范围内有效,也就是说只有在本函数内才能使用它们,在此函数以外是不能使用这些变量的,这种类型的变量就称为“局部变量”。
    全局变量:在函数外定义的变量,可以为本源文件中其它函数所公用,有效范围为从定义变量的位置开始到本源文件结束,这种类型的变量就称为“全局变量”。

    接下来说明一下与存储类型相关的几个属性:
    atuo:在声明局部变量时,若不指定 static,默认均是 auto,这类变量都是动态分配存储空间的,数据存储在动态存储区中。
    static:在声明局部变量时,使用关键字 static 将局部变量指定为“静态局部变量”,这样在函数调用结束后不消失而保留原值,即占用的存储单元不释放,在下一次函数调用时,该变量已有值就是上次函数调用结束时的值。
    register:在声明动态局部变量或者函数形参时,可将变量声明为register,这样编译系统就会为变量分配一个寄存器而不是内存空间,通过这种方式可提升对某些局部变量频繁调用的程序的性能。(寄存器运算速度远高于内存)
    extern:用于扩展全局变量的作用域,比如如果函数想引用一个外部变量,但该外部变量在该函数后定义,那么这个函数需要使用 extern 来声明变量,这样才能使用在该函数后面定义的全局变量。此外,extern 还可以在多文件的程序中声明外部变量。

    由于变量从不同维度划分,形成了多种错综复杂的关系,在学习编程的时候需要重点关注。

    展开全文
  • 静态局部变量动态局部变量区别

    千次阅读 2020-05-13 10:03:05
    2.静态局部变量在编译时赋初值,程序运次时已经有初值,以后每次调用函数不再重新赋初值而只是保留上次函数调用结束时的值。 3.静态局部变量编译时赋初值默认是0 而自动变量,如果不赋初值则它的值是不确定的值。 4....

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

    1.静态局部变量属于静态存储类别,在静态存储区分配存储单元,在整个运行期间都不释放。
    而自动变量(动态局部变量)属于动态存储类别,占动态存储空间,函数调用后释放
    2.静态局部变量在编译时赋初值,程序运次时已经有初值,以后每次调用函数不再重新赋初值而只是保留上次函数调用结束时的值。
    3.静态局部变量编译时赋初值默认是0
    而自动变量,如果不赋初值则它的值是不确定的值。
    4.静态局部变量在函数调用结束后仍然存在,但其他函数不能引用它。

    如果用static修饰全局变量,那么该全局变量不能被其他文件引用。
    不能再被extern(extern和static都是修饰符)
    如果用static修饰函数,那么该函数本文件内可以引用而其他文件不能引用。

    展开全文
  • 动态存储方式与静态存储方式 ...存储期是指变量在内存中的存在期间。这是从变量值存在的时间角度来分析的。存储期可以分为静态存储期(static storage duration)和动态存储期(dynamic storage dur

    动态存储方式与静态存储方式

    我们已经了解了变量的作用域。作用域是从空间的角度来分析的,分为全局变量和局部变量。

     

    变量还有另一种属性——存储期(storage duration,也称生命期)。存储期是指变量在内存中的存在期间。这是从变量值存在的时间角度来分析的。存储期可以分为静态存储期(static storage duration)和动态存储期(dynamic storage duration)。这是由变量的静态存储方式和动态存储方式决定的。

     

    所谓静态存储方式是指在程序运行期间,系统对变量分配固定的存储空间。而动态存储方式则是在程序运行期间,系统对变量动态地分配存储空间。

     

    先看一下内存中的供用户使用的存储空间的情况。这个存储空间可以分为三部分,即:

    程序区

    静态存储区

    动态存储区

     

    图 4.13

     

    数据分别存放在静态存储区和动态存储区中。全局变量全部存放在静态存储区中,在程序开始执行时给全局变量分配存储单元,程序执行完毕就释放这些空间。在程序执行过程中它们占据固定的存储单元,而不是动态地进行分配和释放。

     

    在动态存储区中存放以下数据:

    函数形式参数。在调用函数时给形参分配存储空间。

    函数中的自动变量(未加static声明的局部变量,详见后面的介绍)。

    函数调用时的现场保护和返回地址等。

     

    对以上这些数据,在函数调用开始时分配动态存储空间,函数结束时释放这些空间。在程序执行过程中,这种分配和释放是动态的,如果在一个程序中两次调用同一函数,则要进行两次分配和释放,而两次分配给此函数中局部变量的存储空间地址可能是不相同的。

     

    如果在一个程序中包含若干个函数,每个函数中的局部变量的存储期并不等于整个程序的执行周期,它只是整个程序执行周期的一部分。根据函数调用的情况,系统对局部变量动态地分配和释放存储空间。

     

    在C++中变量除了有数据类型的属性之外,还有存储类别(storage class) 的属性。存储类别指的是数据在内存中存储的方法。存储方法分为静态存储和动态存储两大类。具体包含4种:自动的(auto)静态的(static)寄存器的(register)外部的(extern)。根据变量的存储类别,可以知道变量的作用域和存储期。

    自动变量

    函数中的局部变量,如果不用关键字static加以声明,编译系统对它们是动态地分配存储空间的。函数的形参和在函数中定义的变量(包括在复合语句中定义的变量)都属此类。在调用该函数时,系统给形参和函数中定义的变量分配存储空间,数据存储在动态存储区中。在函数调用结束时就自动释放这些空间。如果是在复合语句中定义的变量,则在变量定义时分配存储空间,在复合语句结束时自动释放空间。因此这类局部变量称为自动变量(auto variable)。自动变量用关键字auto作存储类别的声明。例如:

    int f(int a) //定义f函数,a为形参

    {

        autoint b, c=3; //定义b和c为整型的自动变量

    }

     

    存储类别auto和数据类型int的顺序任意。关键字auto可以省略,如果不写auto,则系统把它默认为自动存储类别,它属于动态存储方式。程序中大多数变量属于自动变量。本教程前面各章所介绍的例子中,在函数中定义的变量都没有声明为auto,其实都默认指定为自动变量。在函数体中以下两种写法作用相同:

    auto int b, c=3;

    int b, c=3;

    用static声明静态局部变量

    有时希望函数中的局部变量的值在函数调用结束后不消失而保留原值,即其占用的存储单元不释放,在下一次该函数调用时,该变量保留上一次函数调用结束时的值。这时就应该指定该局部变量为静态局部变量(static local variable)

     

    静态局部变量的值。

    #include <iostream>
    using namespace std;
    int f(int a)  //定义f函数,a为形参
    {
      auto int  b=0; //定义b为自动变量
      static int c=3; //定义c为静态局部变量
      b=b+1;
      c=c+1;
      return a+b+c;
    }
     
    int main( )
    {
      int a=2,i;
      for(i=0;i<3;i++)
      cout<<f(a)<<" ";
      cout<<endl;
      return 0;
    }


    运行结果为:

    7 8 9

     

    先后3次调用f函数时,b和c的值如书中表4.1所示。

    表 4.1 调用函数时自动变量和静态局部变量的值

    第几次调用

    调用时初值

    调用结束时的值

    自动变量b

    静态局部变量c

    b

    c

    a + b+c

    第1次

    0

    3

    1

    4

    7

    第2次

    0

    4

    1

    5

    8

    第3次

    0

    5

    1

    6

    9

     

    图 4.14

     

    对静态局部变量的说明:

    静态局部变量在静态存储区内分配存储单元。在程序整个运行期间都不释放。而自动变量(即动态局部变量)属于动态存储类别,存储在动态存储区空间(而不是静态存储区空间),函数调用结束后即释放。

    为静态局部变量赋初值是在编译时进行值的,即只赋初值一次,在程序运行时它已有初值。以后每次调用函数时不再重新赋初值而只是保留上次函数调用结束时的值。而为自动变量赋初值,不是在编译时进行的,而是在函数调用时进行,每调用一次函数重新给一次初值,相当于执行一次赋值语句。

    如果在定义局部变量时不赋初值的话,对静态局部变量来说,编译时自动赋初值0(对数值型变量)或空字符(对字符型变量)。而对自动变量来说,如果不赋初值,则它的值是一个不确定的值。这是由于每次函数调用结束后存储单元已释放,下次调用时又重新另分配存储单元,而所分配的单元中的值是不确定的。

    虽然静态局部变量在函数调用结束后仍然存在,但其他函数是不能引用它的,也就是说,在其他函数中它是“不可见”的。

     

    在什么情况下需要用局部静态变量呢?

     

    1) 需要保留函数上一次调用结束时的值。例如可以用下例中的方法求n!。


    输出1~5的阶乘值(即1!,2!,3!,4!,5!)。

     

    #include <iostream>
    using namespace std;
    int fac(int);  //函数声明
    int main( )
    {
      int i;
      for(i=1;i<=5;i++)
         cout<<i<<"!="<<fac(i)<<endl;
      return 0;
    }
     
    int fac(int n)
    {
      static int f=1;  //f为静态局部变量,函数结束时f的值不释放
      f=f*n;  //在f原值基础上乘以n
      return f;
    }

    运行结果为

    1!=1

    2!=2

    3!=6

    4!=24

    5!=120

    每次调用fac(i),就输出一个i,同时保留这个i!的值,以便下次再乘(i+1)。

     

    2) 如果初始化后,变量只被引用而不改变其值,则这时用静态局部变量比较方便,以免每次调用时重新赋值。 但是应该看到,用静态存储要多占内存,而且降低了程序的可读性,当调用次数多时往往弄不清静态局部变量的当前值是什么。因此,如不必要,不要多用静态局部变量。

    用register声明寄存器变量

    一般情况下,变量的值是存放在内存中的。当程序中用到哪一个变量的值时,由控制器发出指令将内存中该变量的值送到CPU中的运算器。经过运算器进行运算,如果需要存数,再从运算器将数据送到内存存放。如图4.15所示。

     

    图 4.15

     

    为提高执行效率,C++允许将局部变量的值放在CPU中的寄存器中,需要用时直接从寄存器取出参加运算,不必再到内存中去存取。这种变量叫做寄存器变量,用关键字register作声明。例如,可以将例4.14中的fac函数改写如下:

    int fac(int n)

    {

      register int i,f=1; //定义i和f是寄存器变量

      for(i=1;i<=n;i++) f=f*i;

       returnf;

    }

    定义f和i是存放在寄存器的局部变量,如果n的值大,则能节约许多执行时间。

     

    在程序中定义寄存器变量对编译系统只是建议性(而不是强制性)的。当今的优化编译系统能够识别使用频繁的变量,自动地将这些变量放在寄存器中。

    用extern声明外部变量

    全局变量(外部变量)是在函数的外部定义的,它的作用域为从变量的定义处开始,到本程序文件的末尾。在此作用域内,全局变量可以为本文件中各个函数所引用。编译时将全局变量分配在静态存储区。

     

    有时需要用extern来声明全局变量,以扩展全局变量的作用域。

     

    1) 在一个文件内声明全局变量

    如果外部变量不在文件的开头定义,其有效的作用范围只限于定义处到文件终了。如果在定义点之前的函数想引用该全局变量,则应该在引用之前用关键字extern对该变量作外部变量声明,表示该变量是一个将在下面定义的全局变量。有了此声明,就可以从声明处起,合法地引用该全局变量,这种声明称为提前引用声明

     

    用extern对外部变量作提前引用声明,以扩展程序文件中的作用域。

    #include <iostream>
    using namespace std;
    int max(int,int);  //函数声明
    void main( )
    {
      extern int a,b;//对全局变量a,b作提前引用声明
      cout<<max(a,b)<<endl;
    }
    int a=15,b=-7;//定义全局变量a,b
    int max(int x,int y)
    {
      int z;
      z=x>y?x:y;
      return z;
    }
    
    

    结果如下:

    15

     

    在main后面定义了全局变量a,b,但由于全局变量定义的位置在函数main之后,因此如果没有程序的第5行,在main函数中是不能引用全局变量a和b的。现在我们在main函数第2行用extern对a和b作了提前引用声明,表示a和b是将在后面定义的变量。这样在main函数中就可以合法地使用全局变量a和b了。如果不作extern声明,编译时会出错,系统认为a和b未经定义。一般都把全局变量的定义放在引用它的所有函数之前,这样可以避免在函数中多加一个extern声明。

     

    2) 在多文件的程序中声明外部变量

    如果一个程序包含两个文件,在两个文件中都要用到同一个外部变量num,不能分别在两个文件中各自定义一个外部变量num。正确的做法是:在任一个文件中定义外部变量num,而在另一文件中用extern对num作外部变量声明。即

       extern int num;

    编译系统由此知道num是一个已在别处定义的外部变量,它先在本文件中找有无外部变量num,如果有,则将其作用域扩展到本行开始(如上节所述),如果本文件中无此外部变量,则在程序连接时从其他文件中找有无外部变量num,如果有,则把在另一文件中定义的外部变量num的作用域扩展到本文件,在本文件中可以合法地引用该外部变量num。

     

    分析下例:

    filel.cpp

    extern int a,b;

    int main()

    {

       cout<<a<<","<<b<<end!;

       return 0;

    }

     

    file2.cpp

    int a=3,b=4;

     

    在源程序文件ffle2.cpp中定义了整型变量a和b,并賦了初值。在filel.cpp中用extern声明外部变量a和b,未賦值。在编译连接成一个程序后,file2.cpp中的a和b的作用域扩展到file2.cpp文件中,因此main函数中的cout语句输出a和b的值为3和4。

     

    用extern扩展全局变量的作用域,虽然能为程序设计带来方便,但应十分慎重,因为在执行一个文件中的函数时,可能会改变了该全局变量的值,从而会影响到另一文件中的函数执行结果。

    用static声明静态外部变量

    有时在程序设计中希望某些外部变量只限于被本文件引用,而不能被其他文件引用。这时可以在定义外部变量时加一个static声明。例如:

    file1.cpp

    static int a=3;

    int main ( )

    {

       ┆

    }

     

    file2.cpp

    extern int a;

    int fun (int n)

    {

       ┆

      a=a*n;

       ┆

    }

     

    在filel.cpp中定义了一个全局变量a,但它用static声明,因此只能用于本文件,虽然 在cpp文件中用了“extern int a;”,但file2.cpp文件中仍然无法使用filel.cpp中的全局变量a。

     

    这种加上static声明、只能用于本文件的外部变量(全局变量)称为静态外部变量。这就为程序的模块化、通用性提供了方便。如果已知道其他文件不需要引用本文件的全局变量,可以对本文件中的全局变量都加上static,成为静态外部变量,以免被其他文件误用。

     

    需要指出,不要误认为用static声明的外部变量才采用静态存储方式(存放在静态存储区中),而不加static的是动态存储(存放在动态存储区)。实际上,两种形式的外部变量都用静态存储方式,只是作用范围不同而已,都是在编译时分配内存的。

    展开全文
  • 贺老师教学链接 C语言及程序设计提高 本课讲解用extern声明外部变量:一个文件内的全局变量#include int max(int,int); int main( ) { extern int a,b; //对全局变量a,b作提前引用声明 printf("%d\n", max(a,b)...
  • 变量存储类别

    2015-04-10 15:32:51
    c语言中变量存储类别
  • C语言的动态存储变量与静态存储变量     动态存储变量与静态存储变量 ...C语言中,每一个变量都有3个属性:一是“数据类型”,如int、float、char等,它确定了变量存储...三是“存储类别”,即变量在内存中的存
  • 变量的存储类别

    2014-09-23 22:34:56
    动态存储,仅函数体或程序块内有效 寄存器变量(register):寄存器中 性质和自动变相同,只是存放寄存器中 静态存储类别 外部变量(extern):内存中 静态存储,即程序开始就建立外部变量知道整个程序...
  • 变量还有另一种属性——存储期(storage duration,也称生命期)。存储期是指变量在内存中的存在期间。这是从变量值存在的时间角度来分析的。存储期可以分为静态存储期(static storage duration)和动态存储期(dynamic ...
  • 变量的属性 1、变量的分类l 根据作用域:可分为全局变量和局部变量。l 根据生存周期:可分为...静态存储方式是指在程序运行期间分配固定的存储空间的方式,动态存储方式是在程序运行期间根据需要进行动态的分配存
  • 多数情况下,我们的被解释变量都是连续变量,但也有些情况下,我们会对分类变量感兴趣,比如,出门时选择何种交通工具?大学毕业时是否继续读研?等等。那么,此时,该用何种模型来分析比较合适呢? 分类变量可...
  • C语言中局部变量和全局变量 变量的存储类别(static,extern,auto,register)   局部变量和全局变量 讨论函数的形参变量时曾经提到,形参变量被调用期间才分配内存单元,调用结束立即释放。这一点表明形参...
  • 变量和函数的存储类别

    千次阅读 2013-10-07 10:19:31
    c语言中,每个变量和函数有两个属性:数据类型和数据的存储类别。 从变量的作用域(即从空间)角度来分,可以分为全局变量和局部变量。 从变量值存在的作时间(即生存期)角度来分,可以分为静态存储方式和动态...
  • C++变量的存储类别与作用域

    千次阅读 2014-08-23 22:06:41
    (1)静态存储类别:静态存数类别变量(我们简称静态变量),从程序的开始处就存在,其生命期伴随整个程序。 (2)自动存储类别:当变量时自动存储类别时,变量进入到定义它们的程序快时定义它,
  • 动态存储变量和静态存储变量

    千次阅读 2011-03-31 20:21:00
    静态变量 全局变量
  • 动态变量与静态变量的区别

    千次阅读 2009-09-08 09:15:00
    而自动变量(即动态局部变量)属于动态存储类别,存储在动态存储区空间(而不是静态存储区空间),函数调用结束后即释放。 2 为静态局部变量赋初值是编译时进行值的,即只赋初值一次,在程序运行时它已有初值。以后...
  • C++语言中变量的储存类别

    千次阅读 2013-07-15 15:06:32
    说明C++语言中变量的存储类别... 静态存储变量一般在变量定义之初就为变量分配了固定的存储单元,这些存储单元直到程序结束的时候才会被释放,而它们一般是存放静态存储区的,如全局变量等;动态存储变量只有
  • 在程序中经常会使用到变量C程序中可以选择变量的不同存储形式,存储类别分为静态存储和动态存储。可以通过存储类别修饰符来告诉编译器要处理什么样的类型变量,具体有一下4种:自动(auto)、静态(static)、...
  • 我们在程序设计中,时时刻刻都用到变量的定义和变量的声明,可有些时候我们对这个概念不是很清楚,知道它是怎么用,但却不知是怎么一会事,下面我就简单的把他们的区别介绍如下: 变量的声明有两种情况: 1、一种...
  • C语言变量的存储类别

    2013-10-31 15:57:41
    前面已经介绍了,从变量的作用域(即从空间)角度来分,可以分为全局变量和局部变量。... 动态存储方式:是在程序运行期间根据需要进行动态的分配存储空间的方式。 用户存储空间可以分为三个部分: 程序区;静态
  • 变量还有另一种属性——存储期(storage duration,也称生命期)。存储期是指变量在内存中的存在期间。这是从变量值存在的时间角度来分析的。存储期可以分为静态存储期(static storage duration)和动态存储期(dynamic ...
  • 根据变量的访问类别可以分为局部变量和全局变量。 局部变量是指函数内部定义的变量。只函数的内部有效,函数外部不能对其进行访问。同理,不函数内部定义的变量被称为外部变量也就是全局变量。全局变量可被多...
  • 变量从作用域(空间)角度来分可以分为全局变量和局部变量 ...动态存储方式:程序在运行期间根据需要进行动态的分配存储空间的方式 内存中供用户使用的存储空间可以分为三个部分:  程序区  静态存储区

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 102,638
精华内容 41,055
关键字:

动态类别变量在程序