1.四种变量存储类别
①自动的----auto
例:
int f(int a)
{
auto int b,c=3;//b和c为整型的自动变量
…………………………
}
auto是局部变量默认的存储类别
例:
①auto int b,c=3;
②int b,c=3;
这俩种的写法效果其实是一样的
auto型的局部变量(即自动型)是存储在动态存储区的,它在定义的时候自动分配存储空间,当作用域结束时自动释放内存空间
②寄存器的---register
用register声明一个寄存器变量
例:
int fac(int n)
{
//下面声明i和f是寄存器变量
register int i,f=1;
for(i=1;i<=n;i++)
return f;
}
这里声明的寄存器变量i和f都是放在寄存器中,由于寄存器在CPU中,是计算机存储体系中离运算器最近,访问最直接,所以速度最快
虽然寄存器变量速度最快,但是由于寄存器比较小,空间有限,所以我们使用的时候应该慎重,好钢要用到刀刃上
这里寄存器变量有一个很可笑的问题,我们在程序中定义寄存器变量对于编译系统其实只是一个建议,而非强制。
我们优化编译系统能够识别使用频繁的变量,自动的将这些变量放在寄存器中
③外部的---extern
extern是用来声明外部变量的,大多数情况下就是针对全局变量,它声明的变量是存储在静态数据区
例:
#include <stdio.h>
int max(int,int);
int main()
{
extern int a,b;//这里extern的作用就是对全局变量a,b做提前的引用声明
printf("%d\n",max(a,b));
return 0;
}
int a=15,b=-7;//定义全局变量a,b 因为我们定义的a,b的位置靠后,所以main函数调用的时候我们用extern先声明它们是全局变量
int max(int x,int y)
{
int z;
z=(x>y)?x:y;
return z;
}
④静态的---static
我们现在用static来声明一个静态的局部变量
例:
int f(int a)
{
static int c=3;//静态变量c c的空间在本函数执行完不会被释放
……………………
}
顾名思义,静态局部变量就是存储在静态存储区的变量,当该静态局部变量使用完后它是不会被释放的,会一直保留到程序执行结束
静态局部变量的性质:
1.局部特性:作用域仅限于本函数
2.静态特性:存储在静态区,函数调用结束后不消失而保留原值,在下一次调用时,保留上一次调用结束时的值
例:
#include <stdio.h>
int f(int a)
{
auto int b=0;
static int c=3;
b+=1;
c+=1;
return a+b+c;
}
int main()
{
int a=2,i;
for(i=0;i<3;i++)
printf("%d ",f(a));
printf("\n");
return 0;
}
运行结果是7 8 9,为什么会出现这种情况呢?这是因为我们定义了一个静态局部变量c,每次调用f函数,c的值在调用完都不会被释放,等待下次调用
通过debug我们其实可以看到 第二次调用函数f的时候 我们c的值就是第一次调用结束时候c的值4,第二次调用程序跳过了再次定义静态c变量这一步,直接赋值4