zoukankan      html  css  js  c++  java
  • C++变量的存储类型

    C++变量和函数包括两个属性:数据类型和数据的存储类型。存储类型是指数据在内存中存储的方式。变量的存储类型分为四种:动类型(auto),寄存器类型(register)、静态类型(static外部类型(extern)其中,自动类型、寄存器类型的变量属于动态变量;静态类型、外部类型的变量属于静态变量。

    1.自动类型(auto)

    用自动类型关键词auto说明的变量称为自动变量。auto只能修饰局部变量,不能修饰全局变量。

    (1)定义格式:
    auto  类型 变量名;
    (2)特性。
    自动变量是动态局部变量,具有块作用域特点,存放在动态存储区。定义时可加auto说明符,也可以省略,所以在程序中没有进行特殊声明都默认是auto型变量,系统以栈(Stack)方式为auto变量分配内存空间,在变量作用域结束后,栈空间由系统进行自动回收。如果自动变量在定义时未初始化,其值默认为随机数。
    示例

    #include<iostream>
    
    using namespace std;
    
    int main() {
    
    int x = 5, y = 10;
    
    for (int k = 1; k <= 2; k++)
    
    {
    
    int m = 0, n = 0;
    
    m = m + 1;
    
    n = n + x+y;
    
    cout << "m=" << m << '	' << "n=" << n << endl;
    
    }
    
    system("pause");
    
    return 0;
    
    }

     2.寄存器类型(register)

    用寄存器类型关键词register说明的变量称为寄存器变量。register只能修饰局部变量,不能修饰全局变量。
    (1)定义格式:
     register 类型 变量名;
    (2)特性。
    寄存器变量是动态局部变量,具有局部作用域,存放在CPU的寄存器或动态存储区;这样可以提高存取速度,如果没有存放在通用寄存器中,便按自动变量处理。
    使用register变量应注意以下几点:
    由于通用寄存器的数量有限,寄存器类型的变量不宜过多。
    变量的长度应与通用寄存器的长度相当。一般为int型或者char型。通常需要把一些频繁使用的局部变量定义为寄存器变量。

    3.静态类型(static)

    用静态类型关键词static说明的变量称为静态变量 static可以修饰局部变量和全局变量。因此静态变量分为静态局部变量和静态全局变量。
    定义格式:
     static 类型 变量名;
    C++中规定静态局部变量有默认值,默认值分别为int型等于0, float型等于0.0,char型为’’,静态全局变量也是如此。而自动类型和寄存器类型变量没有默认值,为随机数

    静态局部变量

    定义在函数内的静态变量称为静态局部变量。
    特点如下:
    (1)静态局部变量本身也是局部变量,具有局部变量的作用域。其作用域局限在定义它的本函数体内,当离开该函数体后,不可使用该变量,但其值还继续保留。也就是说函数结束时,静态局部变量的存储空间不会被释放。
    (2)静态局部变量属于静态存储类别的变量,在程序运行开始就被分配固定的存储单元(占用静态存储区),整个程序运行期间不再被重新分配,生存期是整个程序的运行期间。
    (3)静态局部变量的赋初值时间在编译阶段,且仅被初始化一次,并不是每发生一次函数调用就赋一次初值。当再次调用该函数时,静态局部变量会保留上次调用函数时的值

    【示例】

    #include<iostream>
    
    using namespace std;
    
    void f() {
    
    int x = 0;//x 是自动类型
    
    static int y = 3;//y是局部静态类型
    
    x = x + 1;
    
    y = y + 1;
    
    cout << x << '	' << y << endl;
    
    }
    
    int main ()
    
    {
    
    int i;
    
    for (i = 0; i < 3; i++)
    
    f();
    
    system("pause");
    
    return 0;
    
    }

    分析:x是自动变量,每次调用结束时,变量x的存储单元被释放,然而y是是局部静态类型,静态局部变量的赋初值时间在编译阶段,且仅被初始化一次,并不是每发生一次函数调用就赋一次初值。当再次调用该函数时,静态局部变量会保留上次调用函数时的值。

    静态全局变量

    在定义全局变量时加说明符static,称为静态全局变量。
    静态全局变量只能被定义它的源文件中的所有函数共享。而不能被其他源文件中的函数使用,如果希望全局变量在多个源文件中被使用,则需通过外部(extern)关键字来声明。
    静态全局变量的特点如下。
    (1)与全局变量基本相同,其作用域是定义它的程序文件中,而不是整个程序中的所有文件。
    (2)静态全局变量属于静态存储类别的变量,所以它在程序一开始运行时,就被分配有文件固定的存储单元,默认初始化为0.其生存期是整个程序运行期间。
    (3)使用静态全局变量的好处是同一程序的两个不同源程序文件中可以使用相同名称的变量名,而互不干扰。

    4.外部类型(extern)

    用部类型extern说明的全局变量称为外部变量extern只能修饰全局变量

    其定义格式为

    extern  类型 变量名;

    在由多个源程序文件组成的程序中,如果一个文件要使用另一个文件中定义的全局变量,这些源程序文件之问通过外部类型的变量进行沟通。
    在一个文件中定义的全局变量默认为外部的,即作用域可以延伸到程序的其他文件中。但其他文件如果要使用这个文件中定义的全局变量,必须在使用前用extern作外部声明,外部声明通常放在文件的开头。
    变量定义时编译器为其分配存储空间,而变量声明指明该全局变量已在其他地方说明过,编译系统不再分配存储空间,直接使用变量定义时所分配的空间。
    静态存储(static)类型的作用域与外部(extern)存储类型相反,一旦定义为静态存储类型,就限制该变量只能在定义它的文件中使用,为文件作用域。

  • 相关阅读:
    tracert命令与tracert (IP地址)-d有什么区别?
    linux下通过进程名查看其占用端口
    Union和Union All的区别
    外连接、内连接
    Linux 删除文件夹和文件的命令(强制删除包括非空文件)
    linux查看当前目录
    Linux chmod命令及权限含义
    MySQL的if,case语句
    case when
    java生成验证码图片
  • 原文地址:https://www.cnblogs.com/CX66/p/13933824.html
Copyright © 2011-2022 走看看