• 静态变量、全局变量和局部变量


    1、从作用域角度

    在C++中,变量根据定义的位置不同会具有不同的声明周期,具有不同的作用域。

    (1)全局变量。具有全局作用域,全局变量只需要在一个源文件中定义,就可以在所有源文件中被使用。在其他源文件中,采用extern关键字(表明当前变量的定义在其他源文件中)就能够再次声明这个全局变量;

    (2)局部变量。具有局部作用域,局部变量只在该变量所属函数执行期间存在,当函数调用结束,变量被撤销,其所在的内存空间也将被撤回;

    (3)静态全局变量。具有全局作用域。它与全局变量的区别在于,在一个源文件中定义声明的静态全局变量,在其他文件中不能被使用。两个文件尽管定义了相同名字的静态全局变量,但都是不同的变量;

    (4)静态局部变量。具有局部作用域。这里的局部作用域体现在该静态局部变量所属函数体。静态局部变量与局部变量不同在于,其在函数体内被定义初始化后,直到程序结束都会一直存在,尽管函数体结束,故多次调用同一函数体,将会操作同一个静态局部变量。但其相当于全局变量而言,仅作用于当前函数体,不能够被其他函数使用。

    静态局部变量例子:

    int function(void)
    {
        static int i = 0;
        ++i;
        return i;
    }
    
    int main(void)
    {
        for (int j = 0; j < 5; j++)
        {
            cout<<function()<<endl;   //success,持续输出1-5
        }
        cout<<i<<endl;   //error,不能作用于其他函数
        return 0;
    }

    2、从分配空间角度

    (1)全局变量,静态全局变量,静态局部变量都是在静态存储区分配空间(在整个程序运行期间都存在),而局部变量在栈中分配空间,malloc和new在堆区;

    (2)把局部变量改变为静态变量改变了它的存储方式,即将其从栈区改为了静态存储区,声明周期被改变;全局变量改变为静态变量改变了它的作用域,限制了使用范围,在其他源文件中不能被使用。

  • 相关阅读:
    lightoj-1050
    lightoj-1305
    lightoj-1354
    lightoj-1433
    lightoj-1227
    lightoj-1189
    lightoj-1182
    lightoj-1011
    lightoj-1009
    lightoj-1023
  • 原文地址:https://www.cnblogs.com/scu-cjx/p/8328913.html
Copyright © 2020-2023  润新知