变量的作用域(Scope)指的是变量的作用(能被读写访问的)范围,取决于变量在源程序中被定义的位置。

从此角度可以将变量分为局部变量和全局变量。

局部变量(Local Variable)

*在语句块内(函数、复合语句)定义的变量

作用域:仅能在定义它的语句块(包括其下级语句块)内访问

作用域较小的局部变量隐藏作用域较大的局部变量,二者不会互相干扰。

不考虑静态变量,我们的局部变量一般存储在栈区当中,进入作用域中时为变量在内存中开辟空间,离开作用域后释放内存。

那么,问题来了,如果变量同名,会不会互相干扰呢?

答案是:二者不

会互相干扰,因为编译器有能力区分不同作用域中的同名变量。

打一个形象的比方:我们将内存中的栈区比作一幢酒店,这个酒店有很多层








比如上面是栈区,系统为变量开辟内存空间时,会将同一语句块下的变量放到同一块区域,也就是同一层。离开这块定义域后,就相当于退房,那么就会释放内存,该变量的值也不复存在。作用域不同,二者自然不会相互干扰。

再来介绍一下全局变量,

全局变量(Global Variable)

*在所有函数之外定义的变量

作用范围:从定义变量的位置开始,到本程序结束


全局变量和局部变量有什么区别呢?

不同域动态局部变量,编译器为全局变量在静态存储区中分配变量,这块内存在程序的整个运行期间都存在,直到整个程序运行结束时才被释放。也就是说整个程序的生命周期内都可以使用。

那么如果局部变量和全局变量同名,会发生什么情况呢?由于局部变量和全局变量的存储方式不同,因此二者互不干扰,但在局部变量的作用域中,局部变量会隐藏全局变量。举个例子:


#include<stdio.h>

int a = 2;

void fun()

{

    int a = 3;

    printf("a = %d\n",a);

}

int main()

{

     fun();

    printf("a = %d\n",a);

    return 0;

}

运行结果:

a = 3

a = 2

第一行打印的是局部变量的值,第二行打印的全局变量的值。

当然,全局变量和局部变量还可以往下分,之后的文章会继续探讨变量的存储方式和生命周期。