C语言关键字-const static volatile

        C语言里面有一些关键字在嵌入式开发里面很重要,例如static、const、volatile。下面就说说这几个关键字常用方式与面试时面试官经常提问的问题。

一、static

        在 C 语言中,static 关键字不仅可以用来修饰变量,还可以用来修饰函数。在使用 static 关键字修饰变量时,我们称此变量为静态变量。静态变量的存储方式与全局变量一样,都是静态存储方式。在 C 语言中,关键字 static 有三个明显的作用:

       1、在函数体内,一个被声明为静态的变量在函数调用后保持原值不变。大家都知道函数里的变量执行完都会释放,计算出来的值都不会保留,而函数中的静态变量则不会被释放,以为他是存储在静态区的。

        2、在一个模块内,static修饰的静态全局变量只可以被模块内的函数所调用。

        3、在一个模块内,static修饰的函数只可以被模块内的其他函数调用,但是他不能被工程中的其他模块调用。

二、const

        说 const 定义的是变量,但又相当于常量;说它定义的是常量,但又有变量的属性,所以叫常变量。用 const 定义常变量的方法很简单,就在通常定义变量时前面加 const 即可。常见的用法有以下几种:

1、const int a;

        他的意思就是定义一个长整型数。

2、int const a;

        他的意思也是定义一个长整型数。

3、const int *a;

        他的意思是定义一个指向常整型数的指针。他的整型数不可修改,但是他的指针可以修改。

4、int *const a;

        他的意思是定义一个指向整型数的常指针。也就是说指针指向的整型数可以修改,但是指针不可以修改。

5、int const *a const;

        他的意思是定义一个指向常整型数的常指针,当然他的指针与整型数都不可以修改。

        const的作用其实是为了告诉阅读代码的人,const修饰的变量是不允许改的,也告诉了编译器要保护好const修饰的变量,可以减少开发时的bug。

三、volatile

        volatile 告诉编译器变量是随时可能发生变化的,每次使用它的时候必须从变量的地址中读取。 为什么变量的值需要用volatile修饰呢?因为在嵌入式开发中会面临以下几种情况:并行设备的硬件寄存器、多线程访问共享变量的情况、中断子程序中会访问到的非自动变量。他们都会导致在操作的过程中,变量的值突然发生改变。我找了一个关于volatile的例子:

下面的函数有什么错误:

int square(volatile int *ptr)
{
    return *ptr * *ptr;
}

他是一个求平方的函数,在编译器执行到他时,会把他转化为类似下面的代码:

int square(volatile int *ptr)
{
    int a,b;
    a = *ptr;
    b = *ptr;
    return a * b;
}

在程序执行到4,5行之间时产生中断给(*ptr)++后返回该函数(也有可能是另外一个线程改变了*ptr的值),最后返回的值就变成了a*(a+1),就相当于结果出错了。所以对volatile修饰的变量取平方正确的写法应该是:

int square(volatile int *ptr)
{
    int a;
    a = *ptr;
    return a * a;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

西邮小菜机

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值