- 局部变量
- 普通局部变量(自动变量)
• 在一个函数内定义,只在函数范围内有效。
• 在复合语句中定义,只在符合语句中有效。
• 随着函数调用的结束或复合语句的结束而消亡。
• 如果没有赋初值,则内容为随机值。
2.静态局部变量static
• 作用域:定义的函数内有效。
• 生命周期:在定义的整个周期,静态局部变量始终从在着,即使退出函数,仍然存在。
• 初值:若未赋以初值,则由系统自动赋值;数值型变量自动赋值为0,字符型变量赋空字符。
- 全局变量
1.普通全局变量
• 在函数外定义,可被本文件及其它文件中的函数所共用,若其它文件中的函数调用此变量,须用extern声明。
• 生命周期:在程序运行的整个周期都存在。
• 不同文件的全局变量不可重名。
2. 静态全局变量static
• 在函数外定义,作用范围被限制在所定义的文件中,即其它文件中的函数没法使用。
• 不同文件静态全局变量可重名,但作用域不冲突。
• 生命周期:整个程序运行的周期。
3.说明
• 允许在不同的函数中使用相同的变量名,它们代表不同的对象,分配不同的单元,互不干扰。
• 同一源文件中,允许全局变量和局部变量同名,在局部变量的作用域内,全局变量不起作用。
- const型变量
• 一个变量声明为const变量,意味着该变量是一个常量,不可被修改。
• const变量在定义的时候进行初始化。
• 在使用过程中const修饰的变量只能做右值而不能做左值。
• 一般用于修饰一些不想程序中对其值发生改变的变量。
- register型变量
• 告诉系统register修饰的变量将被频繁使用,对其分配地址时尽量将其分配在寄存器中,以提高访问速度。
• 这个修饰词只是告知CPU尽量将变量分配在寄存器中,不一定真的分配(可能优化处理)。
• register变量必须是一个单个的值,并且其长度应小于或等于整型的长度。
• 局部变量和形参可作为register变量,全局变量或静态变量不行。
• register变量可能不存放在内存中,不能用取地址运算符“&”来获取register变量的地址,也不能用指针来操作。
- volatile型变量(易失变量)
• 表示变量是易失的,易变的。
• 强制访存操作,防止编译器去优化,告诉编译器每次必须去内存中取值,而不是从寄存器或者缓存中取值。
使用情况:
• 并行设备的硬件寄存器(如:状态寄存器)。
• 一个中断服务子程序中会访问到的非自动变量(全局变量、静态变量)。
• 多线程应用中被几个任务共享的变量。