变量的存储类别

来源:互联网 发布:权限管理数据库表设计 编辑:程序博客网 时间:2024/05/11 00:00

              从作用域的角度来看,变量可以分为局部变量和全局变量;从生存期(存在时间)的角度来看,变量又分为静态存储和动态存储。静态存储的变量在整个程序运行期间分配固定的存储空间。动态存储的变量在程序运行的期间根据需要动态分配空间,函数调用开始为其分配地址空间,函数调用结束后释放所占空间。

       内存中,供C程序使用的存储空间分为程序区、静态存储区、动态存储区三部分。程序区专门用于存放源程序(包括函数);静态存储区用于存放静态变量,这些变量在程序编译阶段就已经被分配地址并一次进行初始化了,以后不再进行变量的初始化工作;动态存储区用于存放动态型变量,这些变量在函数调用阶段进行地址分配的,函数调用结束后将自动释放其所占的内存空间。

    在C语言中,变量有数据类型和存储类型两个属性。严格的来说,变量的定义形式为:

      变量的存储类型   变量类型 变量名;

      存储类别具体为自动型(auto)、寄存器型(register)、静态型(static)和外部型四种。

      局部变量的存储类别

      1.自动型局部变量

      自动型局部变量在动态存储区分配存储空间,在调用函数时,系统给他们分配存储空间,在函数调用结束后就自动释放这些存储空间。自动型局部变量用关键字auto做类别说明。

       auto float m;

     2.静态型局部变量

       静态型局部变量在静态存储区分配存储空间,变量的值在函数调用结束后不消失而保留原值,即其占用的存储单元不释放,在下一次函数调用时,该变量已有值,就是上一次调用结束时的值。静态型局部变量用关键字static做存储类别说明,例如:

     static int n;

      静态型局部变量,初始化仅进行一次;在以下情况下使用静态局部变量。

      (1)需要保留上次函数调用结束时的值

      (2)初始化后,变量只被引用而不改其值;

        静态型局部变量与动态型局部变量的区别:

      (1)静态型存储变量属于静态存储类别,在静态存储区分配存储单元  ,在整个程序运行期间不释放,但不能被其他函数引用。自动型局部变量属于动态存储类别,在动态存储区分配存储单元,函数调用结束后即释放;

       (2)静态型局部变量在编译时赋初值,在程序运行时已有初值,以后每次调用函数时不再重新赋初值,只是保留上次调用结束时的值。自动型局部变量在函数调用时赋初值,每次调用一次函数都重新分配存储单元并赋初值,相当于执行一次赋值语句。

       (3)如果在定义静态型局部变量时没有赋初值,编译程序自动对静态型局部变量赋初值,数值型变量为0,字符型变量为空字符。如果在定义动态型局部变量时没有赋初值,它的值是不确定的。只是因为每次函数调用时都重新分配存储单元,而所分配的的存储单元的值是不确定的。

       3.寄存器型局部变量

         为了提高程序的执行效率,C语言允许将局部变量的值放在CPU的通用寄存器中,这种变量称为寄存器型局部变量。寄存器型局部变量用关键字register做存储类型说明,例如: register int a,b;

        (1)只有自动型局部变量和形式参数可以说明为寄存器型变量;

         (2)由于一个计算机系统中寄存器个数是有限的,所以不能定义任意多个寄存器型局部变量。


       全局变量的存储类型

     全局变量是在函数的外部定义的,编译时分配在静态存储区,在整个程序运行期间都占有存储空间。全局变量的作用域为从变量的定义点开始,到它所在的程序文件的末尾。通过引用声明可以扩展全局变量的作用域,引用声明的形式为:

    extern 变量的类型 变量名;

   从作用域的角度来看,全局变量分为外部型和静态型两种。

  1.静态型全局变量

    在定义全局变量时,若在类型名前加一个关键字static,则说明定义的变量为静态型全局变量。通过引用声明,可以扩展静态型全局变量的作用域,但是只能在它所在的文件中扩展,不能扩展到程序中其他文件。也就是说,静态型全局变量只能被它所在的文件中的函数使用,不能被其他文件中的函数使用。如果一个函数要使用它后面的定义的全局变量,则应该在使用前作引用声明。这样就将该全局变量的作用域的起始点从定义点到声明处;

      2.外部型全局变量

      在定义全局变量时,若没有给出存储类别,则定义的变量为外部型全局变量。

      C程序由C源程序文件组成,C源程序文件又由函数组成。通过引用声明,外部型全局变量的作用域可以扩展到定义它之前的函数,也可以扩展到程序中的其他文件。也就是说,外部型全局变量不但可以被它所在的文件中的函数使用,也可以被其他文件中的函数使用。如果一个文件要使用另一个文件中使用定义的全局变量,则在使用它们的文件中作引用声明,说明他们是在其他的文件中定义的外部型的全局变量,这样就可以在该文件中使用其他的文件中定义的外部型的全局变量。         

  

0 0