全局变量与静态变量的区别

根据变量的生命体征情况可以将其分为三个方面:作用域(scope)、生命周期(Lifetime)和链接性(linkage)。

作用域、链接性指的是变量可以在什么地方使用,生命周期指的是变量的值在内存中保留多久,前者是空间属性,后者是时间属性。

全局变量(global variable)​就是在main函数外声明的变量,静态变量(static variable)就是在变量声明时前面加上static的变量,二者的区别如下:

一、作用域

作用域指的是在程序中可访问变量的区域,也可以说成是变量的可见区域。

1.全局变量

具有文件作用域(file scope),即在声明它们的文件内部都可见。

2.静态变量

静态变量可以是全局作用域内的静态变量(在main函数外声明的静态变量),也可以是局部作用域内的静态变量(在main函数内声明的静态变量)。

(1) 全局作用域内的静态变量

和全局变量一样,具有文件作用域。

(2)局部作用域内的静态变量

具有块作用域(block scope)​,通俗来讲块是用一对花括号括起来的区域。也就是说,局部作用域内的静态变量只在声明它们的函数或代码块内可见。

二、生命周期

生命周期有的地方也叫存储期(storage duration),即变量在内存中存活的时长。分配内存表示变量出生,释放内存表示变量死亡。

1.全局变量

从程序开始执行一直到程序结束,即在整个程序运行期间都存在。

2.静态变量

(1)全局作用域内的静态变量

与全局变量相同,从程序开始执行到程序结束。

(2)局部作用域内的静态变量

也与全局变量相同,从程序开始执行到程序结束。

因为它的值一直存在内存中,所以如果把静态局部变量放在函数中,即使在函数返回后,再次调用该函数时,该变量仍会保持上次调用结束时的值。参见以下代码:

#include <stdio.h>

int globalVar = 95; //全局变量
static int staticGlobalVar = 27; //全局作用域内的静态变量

void function() {
static int staticLocalVar = 0; //局部作用域内的静态变量
    staticLocalVar++;
    printf("%d %d %d\n", globalVar, staticGlobalVar, staticLocalVar);
}

int main() {
    function(); // 输出: 95 27 1
    function(); // 输出: 95 27 2
    return 0;
}

注意:静态变量只会初始化一次,即在第二次调用function()时,并不会重新将staticLocalVar初始化为0。这其实很好理解,因为初始化是发生在变量出生之时,静态变量在整个程序执行期间只出生一次,就是在程序开始运行时。

三、链接性

C语言中变量有3种链接属性:外部链接(external linkage)、内部链接(internal linkage)或无链接(no linkage)。

1.全局变量

具有外部链接性,相当于游戏开外挂,意味着一个文件中的全局变量,可以在其他文件中通过extern关键字访问。相当于外部的文件与当前文件中的这个全局变量产生了链接。

2.静态变量

(1)全局作用域内的静态变量

具有内部链接性,即只能在声明它们的文件内部访问。其他文件无法访问,即使通过extern关键字也不行。

(2)局部作用域内的静态变量

无链接性,因为只在声明它们的函数或代码块内可见,所以它们是属于花括号的私人所有,金屋藏娇,别人连勾搭一下都不行。

最后总结一下,就像最开始说的,变量的作用域、生命周期和链接性其实只在描述两种属性:

①空间属性:变量在什么地方使用。

②时间属性:变量在内存中待多久。

关于第①点,对于当前文件来说,只和变量的声明位置有关。花括号就像牢笼一样,决定了变量的访问范围:在花括号内声明,就只能在这个花括号内访问;如果没在任何花括号内声明(即在main函数外声明),自然就摆脱了牢笼的限制,在当前文件内都可以访问。对于外部文件来说,只要记住一点:只能访问全局变量,其他变量都不能访问。这也是全局变量之所以称“全局”的原因,它统揽全局,横跨整个程序。有时候为了方便,人们就称它的作用域为“全局作用域”。因为全局作用域内的静态变量只能在本文件中访问,因而其作用域被简称为“文件作用域”。其实名字不重要,重要的是知道变量在哪能使用就可以了。

对于第②点来说,全局变量和静态变量没有区别,都是在整个程序执行期间一直都呆在内存中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

金创想

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值