局部变量: 定义在函数体内部的变量,作用域仅限于函数体内部。离开函数体就会无效。再调用就是出错。
关于局部变量的作用域还要说明以下几点:
(1)主函数也是一个函数,它与其他函数是平行关系。主函数中定义的变量也只能在主函数中使用,不能在其他函数中使用。同时,主函数中也不能使用其他函数中定义的变量。
(2)形参变量是属于被调函数的局部变量,实参变量是属于主调函数的局部变量。
(3)在不同函数中可以使用相同的变量名,它们代表不同的对象,编译器分配不同的单元,互不干扰。
(4)在复合语句中定义的变量其作用域只能在复合语句范围内。
全局变量: 定义在所有的函数外部定义的变量,它的作用域是整个程序,也就是所有的源文件,包括.c和.h文件。
根据变量的存在时间(生存周期)可以分成:静态存储和动态存储。
静态存储变量:在程序运行期间分配固定存储空间的变量 这种分配变量的方式叫做静态储存方式
动态存储变量:在程序运行期间根据需要进行动态分配存储空间的变量 这种分配方式叫做动态分配方式 ,动态储存变量的例子比如:函数的形参、自动变量(没有加static的局部变量)、函数调用的现场现场保护和返回值。
auto 变量:
函数中的局部变量,如果不专门的声明为 static存储,都是动态分配存储空间。数据存储在动态存储区内。函数中的形参和函数中的变量都属于此类,调用该函数时候系统自动的分配空间,在函数结束的时候,释放该空间。这些局部变量被称为自动变量。自动变量用 auto关键字声明(可以省略auto )。所以下图左边的 increment(); 的运行结果都是1。
static 变量:
如果我们希望调用的函数在释放的时候不消失能保留原值,这就需要定义为静态局部变量。用关键字 static声明。如下图右边的运行结果
对静态局部变量的说明:
1)静态局部变量属于静态存储类别,在静态存储区内分配存储单元。在程序整个运行期间都不释放。而自动变量(即动态局部变量)属于动态存储类别,占动态存储空间,函数调用结束后即释放。
2)静态局部变量在编译时赋初值,即只赋初值一次;而对自动变量赋初值是在函数调用时进行,每调用一次函数重新给一次初值,相当于执行一次赋值语句。
3)如果在定义局部变量时不赋初值的话,则对静态局部变量来说,编译时自动赋初值0(对数值型变量)或空字符(对字符变量)。而对自动变量来说,如果不赋初值则它的值是一个不确定的值。
register变量(了解即可,不建议使用)
部分内容摘自:https://blog.csdn.net/u013355826/article/details/53224303
及广工大计算机网课