局部变量的存储类别 自动变量(auto)在C语言中,每一个变量和函数都有两个属性:数据类型和数据的存储类别
数据类型:比如整型(int),浮点型(float),字符型(char)
数据存储类别:局部变量的存储类别:1.自动变量(auto)2.静态局部变量(static)3.寄存器变量(register)全局变量的存储类别:全局变量都是存储在静态存储区。
一般自己定义的变量都是auto变量,auto可以省略不写,系统默认为auto类型。auto类型的变量在使用时分配存储空间,完事儿了自动释放这些存储空间。auto类型的变量存储在动态存储区。
int a = 1; //等价于 auto int a = 1;静态局部变量(static)
使用static类型定义时,系统只在第一次调用这个变量时初始化,此后该值随着功能(比如你让它加了1,那它将在下次调用时为初始值+1)而改变。
静态局部变量属于静态存储类别,在静态存储区内分配存储单元。在程序整个运行期间都不释放。
此外,跟自动变量还有一点明不同的是,自动变量如果没有初始化,则值为随机值,而静态局部变量则由系统自动初始化为0(或' '(字符类型的话))
静态局部变量的值不能被除了函数本身以外的函数引用。
void aa()
{
static int q = 4;
q++;
}
//初始化时q = 4
//第二次调用时q = 5,再q++,此时q = 6。
寄存器变量(register)
寄存器变量与其它类别最大的不同就是寄存器类别的变量是直接存放在CPU中的寄存器里面。
register int a = 1; //由于计算机的速度越来越快,性能越来越优,优化的编译系统能够识别使用频繁的变量,从而自动地讲这些变量放在寄存器中,而不需要程序设计者指定。因此实际中定义register的必要性不大。全局变量 在一个文件内扩展外部变量的作用域
extern int A; 将下面定义的全局变量A的作用域扩展到这一行开始
//也可以省略int:extern A;//又不是定义变量,只是扩展作用域而已,对吧,没必要再加个数据类型
int max(int x,int y)
{
...
}
int A = 1;
int min(int x, int y)
{
...
A++;
...
}
将作用域扩展到另一个.c文件中
file1.c:
...
int A = 1;
int main()
{
...
A++;
...
}
file2.c:
extern A;
//将file1.c中的全局变量A的作用域扩展到file2.c中
int func()
{
A--;
}
将全局变量的作用域限制在本文件中
吐槽一句,当时在做传感器设计时,由于分了三四个.c文件,导致编译容易重名,要是知道这玩意儿的话,直接可以在.c里面乱搞了
file1.c
static int A = 0;
int main()
{
...
}
file2.c
extern A; //特别注意,此时file1.c中的A变量已经被锁死在file1.c中,所以这里用extern A 是找不到A变量的(除非有file3.c中定义了A变量或者flie1.c的下边定义了A,那这两种情况就是之前将的两种情况了)



