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的主要内容,如果未能解决你的问题,请参考以下文章