c语言中const的几点说明

来源:互联网 发布:warframe端口 编辑:程序博客网 时间:2024/05/03 23:36
(一)关于const的基本说明:
  百度百科里面说“const是一个C语言的关键字,它限定一个变量不允许被改变。”我觉得这个解释不妥,const只是说明这个变量是“只读”的,确切的说是这个变量只是不允许被程序改变,但这个毕竟是个变量,也是可变化的,那他怎么变??
  我举个例子,单片机的AD结果寄存器,其值只读,程序不能改变它,但是它的值随外界模拟电压改变而改变。只读状态寄存器也是同样的道理。
(二)const与指针:
  第一点,const对指针有两种修饰方法:第一种是指针本身的内容只读,第二种是指针指向的内容可读。比如代码const int * const p;表示指针p只读且p指向的数据只读。
  第二点,非congst指针只能单向传向const指针,如下代码:
  int *p1;
  const int *p2;
  p1 = p2;//错误,const指针不能传递给非const指针
  p2 = p1;//正确,非const指针可以传给const指针
分析:假如const指针能传递给非const指针的话则表示通过可变的指针修改常量了,这是规则所不允许的。
(三)const与volatile:
  volatile:不让编译器进行优化,即每次读取或者修改值的时候,都必须重新从内存或者寄存器中读取或者修改。简单地说就是防止编译器对代码进行优化.比如如下程序:
  XBYTE[2]=0x55;
  XBYTE[2]=0x56;
  XBYTE[2]=0x57;
  XBYTE[2]=0x58;
对外部硬件而言,上述四条语句分别表示不同的操作,会产生四种不同的动作,但是编译器就不能像对待纯粹的程序那样对上述四条语句进行优化,只认为XBYTE[2]=0x58(即忽略前三条语句,只产生一条机器代码)。如果键入volatile,则编译器会逐一的进行编译并产生相应的机器代码(四条).
 一般说来,volatile用在如下的几个地方:
    1、中断服务程序中修改的供其它程序检测的变量需要加volatile;
    2、多任务环境下各任务间共享的标志应该加volatile;
    3、存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能由不同意义;
对于代码:volatile const char *p;如何理解?这句代码指p指向的数据不能在程序中更改,但是他的值确是易变的,这并不矛盾,就像我们刚开始分析的那样。再举个例子:
假设只读寄存器名为X,地址为X_ADDR
#define X  (*(const volatile uint32 *)X_ADDR)
(四)#define定义与const定义的效率:(参考http://www.amobbs.com/thread-5475273-1-1.html)
  就用带运算符号的常量表达式来定义宏以及作为const变量赋值表达式的右值而言,因为都是在运行前(预处理时/编译时)进行求值,所以不对运行时性能产生直接影响。
  就存储空间占用情况来讲,const和宏很难说谁占用的更多,这个要看硬件平台的架构、编译器对“const”的实现(这个也受硬件平台架构影响)以及具体的程序上下文。
就运行时效率来讲,跟上述存储空间占用情况一样,受各方面因素影响,结论不确定。
原创粉丝点击