全局变量与局部变量

变量的类型

对于变量,一般可以分为四类:

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

按照存储区域划分:

  • 全局变量、静态全局变量和静态全局变量,都存储在内存的静态存储区域
  • 局部变量存储在栈区域内。

按照作用域划分:

  • 全局变量在整个工程文件内有效;
  • 静态全局变量只在定义它的文件内有效;
  • 静态局部变量只在定义它的函数内有效,只是程序仅分配一次内存,函数返回后,该变量不会消失;
  • 局部变量在定义它的函数内有效,但是函数返回后失效。

关于初始化

  • 全局变量和静态变量如果没有手工初始化,则由编译器初始化为0;
  • 局部变量的值则不确定。

局部变量

局部变量,也称为内部变量。局部变量是在函数内作定义和说明的。
其作用域仅限于函数内部,离开该函数后再使用这种变量是非法的。

  • 主函数中定义的变量只能在主函数内使用,不能在其他函数中使用。同时,主函数中也不能使用其他函数内定义的变量,因为主函数也是一个函数,它与其他函数是平行关系。
  • 形参变量是属于被调函数的局部变量,实参变量属于主函数的局部变量。
  • 允许在不同的函数中使用相同的变量名,它们代表不同的对象,分配不同的单元,互不干扰,也不会发生混淆。

全局变量

全局变量也称为外部变量,它是在函数外部定义的变量。它不属于任何一个函数,它属于一个源程序文件。其作用域是整个源程序。
在函数中使用全局变量,一般应作全局变量说明。只有在函数内说明的全局变量才能使用。
全局变量的说明符为extern。但在一个函数之前定义的全局变量,在该函数内使用可以不再加以说明。

int a,b;
void f1()
{
//body
}
float x,y;
int f2()
{
//body
}
main()
{
//main body
}

从上面的例子可以看出,a、b、x、y都在函数外部定义的外部变量,都是全局变量。但是x、y定义在函数f1之后,而f1内又没有对x、y的说明,所以它们在f1内无效。a、b定义在源程序最前面,因此在f1、f2以及main内也不加说明也可以使用。

  • 对于局部变量的定义和说明,可以不加区分。而对于外部变量而言则不然,外部变量的定义和外部变量的说明并不一样:
  • 对于外部变量的定义,必须写在所有的函数之外,而且只能定义一次。其一般形式为:【extern】类型说明符 变量名 。其中,extern可以省略,例如:
int a, b;
//等价于
extern int a, b;
  • 对于外部变量的说明,则必须出现在要使用该外部变量的各个函数之中。在整个程序内,可以出现多次。由于同一文件中的所有函数都能够引用全局变量的值,因此如果在一个函数中改变了该全局变量的值,就会影响到其他函数中全局变量的值,相当于各个函数之间有直接的传递渠道

变量的存储

静态存储变量,通常是在变量定义时就分好存储单元,并一直保持不变,知道整个程序结束。

动态存储变量,则通常是在程序执行的过程中,使用它时才分配存储单元,使用完毕之后就立即释放。比较典型的例子就是函数的形参,在函数定义时并不给形参分配存储单元,只是在函数被调用时,才会予以分配,调用函数完毕之后就会立即释放。

在C语言中,对变量的存储类型说明有以下四种:

  • auto(自动变量)
  • register(寄存器变量)
  • extern(外部变量)
  • static(静态变量)

自动变量寄存器变量属于动态存储方式。而外部变量静态变量则是属于静态存储方式。
通过在类型说明符之前加上这些关键字,可以说明其存储类型。

参考文章:
局部变量和全局变量的区别
全局变量和局部变量的区别

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值