摘要:const是constant 的缩写,意思是“恒定不变的”!它是定义只读变量的关键字,或者说 const 是定义常变量的关键字。
const
如果一个变量被const修饰,那么它的值就不能再被改变,即不允许给它重新赋值,即使是赋相同的值也不可以。所以说它定义的是只读变量。这也就意味着必须在定义的时候就给它赋初值。用 const 定义常变量的方法很简单,就在通常定义变量时前面加 const 即可,如:
const int a = 10;
const 和变量类型 int 可以互换位置,二者是等价的,即上条语句等价于:
int const a = 10;
如果定义的时候未初始化,不同编译器处理方式不同,有些编译器会自动为其初始化,有些编译器会报错。
静态变量存储位置
- 在PC机中,我们知道,局部变量存储在栈中,静态变量存储在静态存储区中,而经过 const 修饰过的变量存储在内存中的“只读数据段(常量存储区)”中,只读数据段中存放着常量和只读变量等不可修改的量。
- 对于单片机(比如cortex-m3内核的单片机),编译器会将const修饰的只读变量放在ROM(flash)中。
静态变量作用域
- 用 const 修饰的变量,无论是全局变量还是局部变量,生存周期都是程序运行的整个过程(被const修饰后,局部只读变量存放于常量存储区)。
const与define的区别
区别
- 就起作用的阶段而言: #define是在编译的预处理阶段起作用,而const是在编译、运行的时候起作用。
- 就起作用的方式而言: #define只是简单的字符串替换,没有类型检查。而const有对应的数据类型,是要进行判断的,可以避免一些低级的错误。
- 就存储方式而言:#define只是进行展开,有多少地方使用,就替换多少次,它定义的宏常量在内存中有若干个备份;const定义的只读变量在程序运行过程中只有一份备份。
- 从代码调试的方便程度而言: const常量可以进行调试的,define是不能进行调试的,因为在预编译阶段就已经替换掉了。
- const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误。
- 有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试。
- const可节省空间,避免不必要的内存分配,提高效率
补充:
- 如果定义的时候未初始化,不同编译器处理方式不同,有些编译器会自动为其初始化,有些编译器会报错。
- 只读变量仍然可以通过指针修改(单片机上不可以),所以说const只是修饰的只是变量名而已。
参考链接
https://blog.csdn.net/qq_29344757/article/details/75730054
http://www.openedv.com/posts/list/38495.htm
http://c.biancheng.net/view/217.html
https://www.cnblogs.com/zhangfeionline/p/5882790.html
https://blog.csdn.net/he__yuan/article/details/81607804
https://blog.csdn.net/toptp2017/article/details/79754434
https://blog.csdn.net/weibo1230123/article/details/81981384