变量的存储类型
动态存储
auto 自动变量
register 寄存器变量
静态存储
static 静态变量
extern 外部变量
1.自动变量 类型说明符为auto
通过auto关键字来修饰一个局部变量。这意味着每一次执行到定义变量的时候,都会产生一个行的变量,并且重新对它初始化
这种存储类型是C语言程序中使用最广泛的一种类型。C语言规定,函数内凡未加存储类型说明的变量均视为自动变量,也就是说自动变量可省去说明符auto。
如:int、float、double、char。
注意:auto可以省略,局部变量默认存储方式就是自动变量类型,即auto int=int,使用完立即销毁
自动变量的作用域仅限于定义该变量的个体内(局部变量)。在函数中定义的自动变量,只在该函数内有效。在复合语句中定义的自动变量只在该复合语句中有效。
自动变量属于动态存储方式,只有在使用它,即定义该变量的函数被调用时才给它分配存储单元,开始它的生存期。函数调用结束,释放存储单元,结束生存期。因此函数调用结束之后,自动变量的值不能保留。在复合语句中定义的自动变量,在退出复合语句后也不能再使用,否则将引起错误。
由于自动变量的作用域和生存期都局限于定义它的个体内(函数或复合语句内),因此不同的个体中允许使用同名的变量而不会混淆。即使在函数内定义的自动变量也可与该函数内部的复合语句中定义的自动变量同名。
void show()
{int i=10;
printf("i=%d\n",i);
i=i+1;}
main()
{show();
show();
show();}
//执行了三次show函数,输出结果是三个10,每执行一次show函数,对i再重新初始化一次10,故为auto类型
2.静态变量 类型说明符为static
定义的时候必须初始化,只进行一次初始化,保留上一次结果。
生命周期:跟随程序启动时就为它定义好,程序运行结束,它才结束(从程序启动到程序结束)。
void show()
{static int i=10;//static类型
printf("i=%d\n",i);
i=i+1;}
main()
{show();
show();
show();}
//输出结果:10,11,12
int count=0;
while(count<3)
{
static int s_count=0;//只做一次初始化
int i_count = 0;
s_count++;
i_count++;
printf("s_count=%d\n", s_count);
printf("i_count=%d\n", i_count);
count++;
}
/*
输出:
s_count=1
i_count=1
s_count=2
i_count=1
s_count=3
i_count=1
3.寄存器变量 类型说明符register
指定某个局部变量存放到计算机硬件的寄存器中而不是内存中。
寄存器(CPU):缓存数据,但存储数据有限。
由于寄存器数量有限,当定义多个寄存器变量时,计算机不一定会分配给实际存储。
各类变量都存放在存储器捏,当对一个变量频繁读写时,必然要反复访问存储器,从而花费大量的存取时间。c提供了寄存器变量,这种变量存放在CPU的寄存器中,使用时不需要访问内存,直接从寄存器中读写,可提高效率。
对于循环次数多的循环控制变量可定义为寄存器变量。
#include <stdio.h>
main(){
register i,s=0;
for(i=1;i<200;i++){
s=s+i;
printf("s=%d\n",s);
}
}
注意:
1、只有局部自动变量和形式参数才可以定义为寄存器变量。
2、根据机器不同,cpu中寄存器的个数是有限制的。
外部存储变量 extern
#include <stdio.h>
int i;//全局变量,可以在当前文件里任意函数中使用,自动初始化为0
int l=5;//全局变量可以赋初值
extern int j;//外部变量
main()
{
int k;//局部变量,不会初始化为0,使用之前必须初始化,或者赋值。
return 0;
}
变量作用域
局部变量:被{}包含的变量
全局变量:没有被{}包含,不做初始化,默认初始化为0。
大括号产生到大括号结束,同一作用域下,变量名不能同名
同名问题的选择:就近原则,当有与自己同名的变量时,使用距离最近的那个