C语言拾遗-C语言关键字-const

摘要: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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值