1.全局变量
我们之前所见过的所有的变量,都是定义在函数内部的.那个时候我们说,这些变量呢,叫做本地变量,其实当时我们没说,如果c语言当中所有的变量都是定义在函数内部的,那就没有本地变量非本地变量一说了对吧.正是因为我们可以把变量定义在函数的外面,这时候它就不是本地变量了.所以如果有变量定义在函数外面,那么这些变量呢叫做全局变量.本地变量当时我们说最大的特点是什么,进这个函数的时候这个变量才出现,一旦离开这个函数,它就不存在了.只有在这个函数内部,它才可见,才能够被访问.它的生存期和作用域是一致的,都是在函数内部,而对于全局变量就不一样了.
我们来看一个例子:
现在我们有一个变量叫做gall,它是定义在函数外面的,我们给了它一个初始值12.这个变量就是全局变量,他和任何函数都没有关系.和main没有关系,和f也没有关系.它的作用域是大于所有函数的.我们首先在main里面做输出,_func_是一个字符串,它表示的是当前这个函数的名字.我们输出了之后去调用f函数,f函数做的事情是先输出在f函数里的gall,发现和main里面的那个gall一样,然后让gall+2,再打印gall,最后返回gall的值.然后回到main,我们打印gall,发现和f函数最后的gall的结果一样,都是14.
2.全局变量的初始化
当然我们可以对全局变量做初始化.但是如果我们没有给它定义初始化会怎么样?我们之前在讲本地变量的时候,我们一直在反复强调这件事情,本地变量不会得到默认的自动的那么一个初始值,如果你不对它做初始化,你直接去使用那个本地变量的值,你可能会得到乱七八糟的结果,也就是这个变量所占内存原来就有的东西.但是对于全局变量来说.
我们尝试让gall=f();我们发现编译器给了我们一个error,它说这个右边的东西不是一个编译时刻的常量,因为要调用一个函数才能得到这个结果.那如果我们这样,我们定义gall=12,然后再定义一个g2=gall,这样行不行呢?编译器一样说不行.他看到的是你把一个变量的值赋给了g2.但如果我们在定义gall的前面再加一个const,它就可以了.当然我们非常不建议大家用这种方式来初始化像g2这样的一个全局变量,全局变量的值不应该和另外一个全局变量联系在一块.这事儿到后面我们讲大程序的时候你就会明白,我们现在的两个全局变量都是写在同一个.c文件里头的.它们的初始化的顺序是相对比较明确的.如果反过来就会有问题.
另外,如果函数内部存在与全局变量同名的变量,则全局变量被隐藏.