C语言关键字-const static volatile

Posted Linux bsping

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
}

以上是关于C语言关键字-const static volatile的主要内容,如果未能解决你的问题,请参考以下文章

const与static的区别

C语言中auto,register,static,const,volatile的区别

volatile与const综合分析

关键字const和static

const,static,volatile

C语言中的常见关键字