变量的作用域(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
第一行打印的是局部变量的值,第二行打印的全局变量的值。
当然,全局变量和局部变量还可以往下分,之后的文章会继续探讨变量的存储方式和生命周期。