全局变量:全局变量和局部变量小记

 什么是全局变量?什么是局部变量?

 如图,定义在函数外的变量就是全局变量,而定义在函数里面的,就是局部变量,这里的函数外和函数内,不仅仅是指main,而是所有函数。

这是最直接的辨别方法,函数外全局变量,函数内局部变量,知道什么是局部变量什么是全局变量后,就得知道它们的使用方法了。

先来看全局变量,它的定义有些规则,比局部变量更复杂一点点。

图一

图二

 

 以上两种定义全局变量的方法均是合法的。

这种定义全局变量的方法和图一 的相似,但却是不行的,原因是因为a被多次初始化,也就是说,全局变量被定义时,不能多次初始化,只能初始化一次。而图一中a先被声明,再被初始化。

全局变量定义

  • 先声明,在初始化。
  • 声明的同时初始化。
  •  那么,如果不初始化呢?

     如果不初始化,不赋值给全局变量,可以发现全局变量中存储的值是0。

    静态存储类型如果不初始化的话,它的值就自动存0,由此可得,全局变量是静态存储类型。

    局部变量

     可以重复初始化。

     

     但声明后,最好初始化,其实一般编译器不会报错,因为局部变量声明后,其里面是存在一个随机值的,但最好还是初始化一下,一般声音的同时,会把局部变量初始化为零。

    全局变量和局部变量未初始化时

  • 全局变量为0
  • 局部变量为随机值。
  • 这是因为全局变量属于静态存储类型,局部变量处于动态存储类型。

    在来看看全局变量和局部变量的作用范围。

     由图可知,全局变量的作用范围是整个程序,而局部边量作用范围是函数内部,也就是{}内部。

  • 第一个x的打印是函数print_x,函数没有形参,它打印的x是全局变量,即打印800。
  • 第二个x打印的是局部变量,有人说,既然全局变量的作用范围是整个文件,为什么不打印700,这其实关系到优先级问题,当局部变量名和全局变量名一致时,在函数内部定义的局部变量,使用时,优先级比全局变量高,也就是说,这时候优先打印局部变量。说优先也不对

  •  全局变量作用范围是整个文件,它有文件作用域,局部变量作用范围是函数内部,就是{}内部,它是块作用域,如果两个同名变量分别拥有文件作用域和块作用域,那么只有拥有块作用域的变量是可见的,而拥有文件作用域的变量会被隐藏,不可见,这就是为什么,在函数内部,直接打印x,其值会是800,而不是700。

  • 进入for循环,又进入了一个新代码块,这时候有声明并初始话一个x,这个x同样拥有块作用域,对于for循环外的x,它的块作用域相较于for循环内的x就是文件作用域,故,打印的是for循环内的x值,而不是800。
  • 当出了for循环,只有块作用域的x会从for循环中释放,下一个printf打印的是,拥有块作用域的800。
  • 综上所述

  • 局部变量是定义在函数内部的变量,作用只在函数体内部,拥有块作用域离开函数体就无效。
  • 全局变量是定义在函数体外部的变量,作用的是整个文件,拥有文件作用域,作用域会整个程序,也就是所有的源文件,包括c和h文件。
  • 相关推荐

    相关文章