转自http://blog.csdn.net/w825828482/article/details/20526145
(1)局部变量
在一个函数内部定义的变量是内部变量,它只在本函数范围内有效,也就是说只有在本函数内才能使用它们,在此函数以外时不能使用这些变量的,它们称为局部变量.
1.主函数main中定义的变量也只在主函数中有效,而不因为在主函数中定义而在整个文件或程序中有效.
2.不同函数中可以使用名字相同的变量,它们代表不同的对象,互不干扰.
3.形式参数也使局部变量.
4.在一个函数内部,可以在复合语句中定义变量,这些变量只在本符合语句中有效.
(2)全局变量
在函数外定义的变量是外部变量,外部变量是全局变量,全局变量可以为本文件中其它函数所共用,它的有效范围从定义变量的位置开始到本源文件结束.
1.设全局变量的作用:增加了函数间数据联系的渠道.
2.建议不再必要的时候不要使用全局变量,因为
a.全局变量在程序的全部执行过程中都占用存储单元.
b.它使函数的通用性降低了c.使用全局变量过多,会降低程序的清晰性.
3.如果外部变量在文件开头定义,则在整个文件范围内都可以使用该外部变量,如果不再文件开头定义,按上面规定作用范围只限于定义点到文件终了.如果在定义点之前的函数想引用该外部变量,则应该在该函数中用关键字extern作外部变量说明.
4.如果在同一个源文件中,外部变量与局部变量同名,则在局部变量的作用范围内,外部变量不起作用.
(3)静态变量
静态变量的作用范围要看静态变量的位置,如果在函数里,则作用范围就是这个函数.
静态全局变量,只在本文件可以用,虽然整个程序包含多个文件,但静态全局变量只能用在定义它的那个文件里,却不能用在程序中的其他文件里.它是定义存储因型为静态型的外部变量,其作用域是从定义点到程序结束,所不同的是存储类型决定了存储地点,静态型变量是存放在内存的数据区中的,它们在程序开始运行前就分配了固定的字节,在程序运行过程中被分配的字节大小是不改变的,只有程序运行结束后,才释放所占用的内存.
【attention】
操作系统和编译器如何判断全局变量和局部变量?
操作系统和编译器是根据程序运行的内存区域来获取该变量的类型.程序的全局数据放在所分配内存的全局数据区,程序的局部数据放在栈区.
【attention】
<1>static全局变量与普通的全局变量有什么区别?
全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式.这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的.而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它.由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误.从以上分析可以看出, 把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域, 限制了它的使用范围.
<2>static函数与普通函数有什么区别?
static函数与普通函数作用域不同.仅在本文件。只在当前源文件中使用的函数应该说明为内部函数(static),内部函数应该在当前源文件中说明和定义.对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件.
<3>static局部变量和普通局部变量有什么区别?
static局部变量只被初始化一次,下一次依据上一次结果值;