变量存储类型


auto

自动存储

在C语言中变量默认是auto变量,表示系统自动为变量分配内存。


register

寄存器存储

有可能会因为寄存器不足而申请失败。特点为效率高,速度快。

#include <stdio.h>

int main(int argc, char *argv[])
{
    int a = 0;
    // register int a = 0;
    while( a != 1000000000) // while循环
        a++;
    return 0;
}

static

静态存储

被声明为静态存储类型的变量时,无论是全局的还是局部的,该变量都存储在静态区中,其生命周期为整个程序。

如果是静态局部变量,其作用域为一对 { } 内;如果是静态全局变量,其作用域为当前文件。

静态变量如果没有被初始化,则自动初始化为零。静态变量只能初始化一次。

一、static修饰局部变量,延长生命周期,将该局部变量存储于静态区,会在程序结束后释放。其作用域为一对 { } 内。

#include <stdio.h>

int main(int argc, char *argv[])
{
    int a = 0;
    while (a != 3)
    {
        int num = 20;
        num = num + 20;
        a++;
        printf("num:%d\n", num);
    }
    return 0;
}

// 结果为
// num:40
// num:40
// num:40

#include <stdio.h>

int main(int argc, char *argv[])
{
    int a = 0;
    while (a != 3)
    {
        static int num = 20;
        num = num + 20;
        a++;
        printf("num:%d\n", num);
    }
    return 0;
}

// 结果为
// num:40
// num:60
// num:80

二、static修饰全局变量,限制作用域,该全局变量只能在本文件中使用。全局变量原本就存储在静态区(全局变量区)中,在程序结束后释放。

demo_extern.c:
#include <stdio.h>
extern int a;
int main(int argc, char *argv[])
{
    printf("a:%d\n", a);
    return 0;
}

1.c:
#include <stdio.h>
static int a = 20;

gcc demo_extern.c 1.c
编译会报错,找不到外部对a的定义,因为static限制了全局变量只能在本文件中使用

三、static修饰函数,限制作用域,该函数只能在本文件中使用。


extern

外部调用存储

如果一个文件调用另一个文件中的变量,则在调用文件中需要使用extern关键字声明该变量。

demo_extern.c:
#include <stdio.h>
extern int a;
int main(int argc, char *argv[])
{
    printf("a:%d\n", a);
    return 0;
}

1.c:
#include <stdio.h>
int a = 20;

gcc demo_extern.c 1.c
./a.out
运行结果为:
a:20

const

将变量常量化,被const修饰的变量,其内容不可修改,变成了read-only。

#include <stdio.h>
int main(int argc, char *argv[])
{
    const int a = 10;
    a = 20;
    return 0;
}

编译时报错:
demo_const.c: In function ‘main’:
demo_const.c:12:7: error: assignment of read-only variable ‘a’
  12 | a = 20;
     | ^

volatile

防止代码被优化,从内存当中直接读取数据而非缓冲区。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值