提高篇 第12节-变量的存储类别

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





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值