在c语言中,常用const来定义常量,在嵌入式中,const字符可以将常量(数表)直接保存在Flash种。很多的教材中,描述const关键字的作用是,const修饰的变量不可被程序修改,但其实不是这样。const只是让变量不能作为左值,但可以通过取指针操作来修改const变量的值,如:
对const变量进行赋值(非初始化)操作会直接报错:
#include <stdio.h>
int main(void)
{
const int num = 0;
num = 5;
}
具体报错如下:
这里错误信息提示,左值指定const对象。但是很可惜,const修饰的变量无法作为左值,所以程序直接报错。但是,这并不代表const变量不能被修改。接下来,通过指针操作来修改const变量的值。
指针操作:
#include <stdio.h>
int main(void)
{
const int num = 0;
int* ptd = #
printf("origin num is %d, address is %p\n", num, ptd);
*ptd = 5; /* 通过指针修改num的值 */
printf("new num is %d, address is %p\n", num, ptd);
}
这里Visual Studio依然会给出一个warning,说明const变量不同(值被修改),但是可以运行:
警告说明:
接下来是程序输出结果。跟我们的预期一致,const变量的值已经变为5。
至于volatile,在mdk优化等级很高的时候,会出现意想不到的问题,可以参考之前的博客:
https://blog.csdn.net/dingyc_ee/article/details/97567037
这篇博客中记载了不加volatile关键词会出错的实例,也是调试了很久才解决,仅供参考!