1、局部变量(普通)与静态局部变量
局部变量被分配在栈中,只能在定义该变量的函数内使用,它会随着函数的被调用和退出而生成和消失。
静态局部变量 被放在程序的静态存储区中,具有局部作用域,它不随着函数的退出而消失,一直存在静态存储区内,但它不能被其他函数访问,每次调用该函数时,静态变量在上一次的值上更新。
1、 Static类内部变量同auto自动变量(即未加 Static 声明的局部变量)一样,是某个特定函数的局部变量,即只能在定义该变量的函数内使用该变量,2者作用域相同;两者的不同在于:auto自动变量会随着函数 被调用和退出而存在和消失,而static类局部变量不会,它不管其所在的函数是否被调用,都将一直存在;不过,尽管该变量还继续存在,但不能使用它。倘 若再次调用定义它的函数时,它又可继续使用,而且保存了前次被调用后留下的值。换言之,Static类型的内部变量是一种只能在某个特定函数中使用,但一 直占据存储空间的变量。
2、函数体内如果在定义静态变量的同时进行了初始化,则以后程序不再进行初始化操作(出现在函数内部的基本类型的的静态变量初始化语句只有在第一次调用才执行)。而对自动变量赋初值是在函数调用时进行,每调用一次函数重新给一次初值,相当于执行一次赋值语句。
3、静态局部变量的初始化表达式必须是一个常量或者常量表达式。即使局部静态变量定义时没有赋初值,系统会自动赋初值0(对数值型变量)或空字符(对字符变量);静态变量的初始值为0。而对自动变量auto来说,如果不赋初值则它的值将是个不确定的值。
4、当多次调用一个函数且要求在调用之间保留某些变量的值时,可考虑采用静态局部变量。虽然用全局变量也可以达到上述目的,但全局变量有时会造成意外的副作用,因此仍以采用局部静态变量为宜。
注:局部静态变量占用内存时间较长,并且可读性差,因此,除非必要,尽量避免使用局部静态变量。
2、 全局变量和静态全局变量
两者的存储方式相同,都存放在静态存储区,但两者的作用域不同,当一个源程序由多个源文件组成时,前者在整个源文件中都是有效的(其他不包括全局变量定义的源文件需要用extern关键字再次声明这个全局变量),后者只在定义该变量的源文件中有效。