全局变量、局部变量(auto局部变量)、静态全局变量、静态局部变量的区别

来源:互联网 发布:mac电脑照片怎么删除 编辑:程序博客网 时间:2024/06/05 01:04

C/C++变量根据定义位置的不同,具有不同的作用域和存储域

作用域可分为6种:全局作用域,局部作用域,语句作用域,类作用域,命名作用域和文件作用域。

存储可分为2种:静态存储区和栈区,另:函数申请内存空间在堆区里面(这不在本文讨论范围之内)。

首先,从作用域看,

全局变量具有全局作用域,只需在一个源文件中定义,就可以作用于所有的源文件。当然,其它不包括全局变量定义的源文件,需要用extern关键字再次声明该全局变量,之后才可以在该源文件中使用;

静态全局变量具有全局作用域,它与全局变量的区别在于,如果程序包含多个文件的话,作用于定义自己的文件里,不能作用于其它源文件中,即被static关键字修饰过的变量具有文件作用域。所以即使两个不同的源文件都定义了相同的静态全局变量,他们也是不同的变量;

局部变量具有局部作用域,它是自动(auto)类型,在程序运行期间不是一直存在,只有在函数执行期间存在,函数的一次调用结束后,变量所占用的内存即被收回;

静态局部变量具有局部作用域,它只被初始化一次,从第一次初始化到程序运行结束都一直存在,即使函数调用结束后也仍然存在,但不可被其它函数调用,因其只对定义自己的函数体可见

其次,从存储域(也即内存分配空间)看,

全局变量、静态全局变量、静态局部变量都在静态存储区分配空间,而局部变量在栈区分配空间。

1、静态存储区里的数据可以在下一次调用的时候保持原来的赋值,这是其与栈变量和堆变量的最大区别。

2、静态变量用关键字static告知编译器自己的作用域。

3、函数中必须要使用static变量的情况:当某函数的返回值为指针类型时,则必须是static的局部变量的地址作为返回值,若为auto类型,则返回为错指针。

从以上分析可以看出,局部变量改变为静态局部变量后是改变存储方式,即改变了生存周期;而把全局变量改变为静态变量后是改变了作用域,限制了其使用范围。


另外详细对比静态局部变量与自动局部变量的区别:

1、一般情况下,不作专门说明的局部变量,均是自动变量,可用关键字auto作出说明,称作为自动局部变量。不存在自动全局变量,全局变量的类型只能定义为extern或static。

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

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

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

5、虽然静态局部变量在函数调用结束后仍然存在,但其他函数不能引用它。

0 0
原创粉丝点击