按照变量的定义位置分类,在函数外部定义的变量为 全局变量 或者 外部变量;在函数内部定义的变量为 局部变量。
在不加修饰\(^*\)的情况下,全局变量的作用域是定义以下的整个文件,局部变量的定义域是定义以下的所在函数体。在函数内访问变量时,优先查找局部变量,所以如果局部变量与全局变量同名,局部变量会“遮蔽”全局变量。
全局变量的存储位置是静态存储区,不加修饰的局部变量的存储位置是动态存储区。
* “修饰”是在定义变量时通过添加额外的关键字来改变变量的特性,不加修饰或者用 auto 修饰的变量称为 自动变量。
const 修饰符将一个变量声明为 常变量。常变量是只读的,只能在定义时进行赋值(如不赋值则编译器默认初始化为 \(0\))。const 不改变变量的存储位置,也就是说,全局常变量仍然存储在静态存储区,局部常变量仍然存储在动态存储区(这使得局部常变量可以通过指针间接修改)。
extern 修饰符的作用是扩展一个全局变量的作用域(不能修饰局部变量),将作用域扩展到定义点之前或者其他文件里。使用 extern 时,我们没有定义新变量,只是进行了声明。
static 修饰符的作用是将变量声明为 静态变量,静态变量存储在静态存储区中,即使它本身是定义在函数之中的局部变量,这使得我们可以保存函数的局部变量,在下次调用时继续使用。static 不改变变量的作用域,静态局部变量的作用域仍然只在对应函数之内。特别的,全局变量如果被 static 修饰,就失去了被其他文件 extern 的能力,只能在本文件中生效。
register 修饰符的作用是直接将变量定义在寄存器而非内存中,这类变量叫做 寄存器变量。寄存器变量的使用能够提高程序的运行效率,但是大量的使用寄存器变量可能会填满寄存器,反而降低运行速度!更不能用 register 修饰全局变量,否则它们会一直占据寄存器空间,造成资源浪费。
标签:存储,分类,变量,局部变量,C语言,修饰,全局变量,定义 From: https://www.cnblogs.com/th19/p/17816615.html