变量的作用域:变量的有效范围
》局部变量
1.函数内局部变量,这个变量在该函数结束后自动撤销
2.函数内的复合语句中的局部变量(比如for语句),这个变量在复合语句结束后自动撤销,这个变量可以与1中的变量重名,在复合语句作用域中里面定义的变量权限更高,考虑到可读性不推荐这么做
例如:
#include<stdio.h> #include<stdlib.h> void fun1(); int main() { fun1(); } void fun1() { int m=200; int i=0; for(i=0;i<1;i++) { int m=5; printf("%d",m); } printf("%d\n",m); system("pause"); } //输出结果为:5 200
》全局变量
定义在所有函数外部的变量,需要注意和区分的是变量的定义和声明,只要在所有函数外面定义的变量就是全局变量 ,所以这个变量不一定在一个文件的最前面几行代码,如果这个变量定义在一个函数的后面,而这个函数需要用到这个变量,那么这个变量就需在这个函数之前声明或者在这个函数内部声明方可使用,如果这个变量定在这个函数的前面,那么可以省去声明,
定义一个变量的一般形式:extern 类型说明符 变量名 (比如:int a ,在定义的时候extern可以省略,)
声明一个变量的一般形式:extern 类型说明符 变量名 (声明变量时extern不可以省略,)
变量的储存方式:储存方式决定了函数的生存期
》静态储存
可以用关键字 static(描述静态变量) extern(描述外部变量) 来定义一个‘静态储存的变量‘,注意引号之间的措词,也就是说静态变量是采用静态储存方式,而全局变量也是采用静态储存方式,静态变量和静态储存不是一个意思
·
静态变量一直存在,在预编阶段分配了内存空间,直到整个程序结束才销毁
》动态储存
可以用关键字 auto(描述自动变量,如果定义一个变量不写描述符那么就是默认的auto) register(描述寄存器变量) 来定义一个动态储存的变量,
动态变量在该函数或该复合语句开始执行时分配,结束时自动清除内存
例如:函数的形参,在定义函数时并不分配内存,只有在调用时分配,调用结束后自动释放内存
复合语句也一个道理
静态变量之全局和局部
》静态局部变量
静态局部变量在函数内定义,他的生存周期为整个程序执行期间,但是其作用域任然与自动变量相同,只能在定义该变量的函数内使用该变量,函数调用结束后尽管该变量还继续存在,但不能直接访问它,如果在整个程序执行期间再次调用定义它的那个函数,在这个函数内可继续使用这个变量,变量的值为上次函数调用完时的状态,这一点很有用,当然全部变量也可以实现一样的效果,但是容易产生副作用,
》静态全局变量
这个在程序执行期间一直有效,
需要注意的是 静态全局变量 和非静态全局变量(全局变量)
一个程序往往有很多源代码,一个源文件中包含了另外一个源代码文件,
总结来说就是:全局变量在所有包含了它的源文件中均有效,而静态全局变量只有在定义它的源文件中有效,
总结论:把局部变量改为静态变量后改变了它的储存方式,即改变了它的生存周期;把全局变量改为静态变量后改变了它的作用域,限制了它的使用范围