const与volatile

一个例子说明const

const and volatile

const与指针一起使用的情况分析及总结:

        const int nValue; //nValue是const

       int const nValue; // nValue是const

  const char *pContent; //*pContent是const, pContent可变

  const (char *) pContent;//pContent是const,*pContent可变

  char* const pContent; //pContent是const,*pContent可变

  char const * pContent;// *pContent是const, pContent可变

  (char *) const pContent;//pContent是const,*pContent可变

  char* const pContent;// pContent是const,*pContent可变

  char const* const pContent;// pContent和*pContent都是const

        const char* const pContent; //pContent和*pContent都是const

我们可以这样总结:const没有固定的格式用法,它只是个修饰符。在和指针连用时,其实就是声明某个变量为const。若变量pContent和*紧挨在一起,则就被声明为const的为pContent(最后两个例子和这个原则上是一致的)。const char *pContent;还有char const * pContent中,const都是在修饰* pContent。其实,如果我们安静看看代码,这些表达方式是符合人们习惯的。

 

const int a=1;
int *p;
p=&a;
p=&((int)a);

p=(int *)(&a);

第一个赋值是错误的,这符合我们的预期,编译器给的原因是“error C2440: “=”: 无法从“const int *”转换为“int *””

第二个赋值也是错误的,这个错误出在类型指派上。所谓的指派,会在与a的存储区域不同的地方产生一个新值,这当然是个常量,并且对它去地址是没有意义的。编译器给的原因是“error C2101: 常量上的“&””、“ 无法从“int”转换为“int *””

第三个是可以的。

由此可知,const这个修饰符,修饰的是a,也就是说不能通过a来修改数据,但其实这个变量是可以修改的,就如上边第三个赋值语句所示的方法。

 在我的项目中,有这样的用法:

void * const modbus_map4[]={
&Remote_instruction,
&RTC_ym,
&RTC_dh,
&RTC_ms,
&Link_timeout,
};

在之后的程序中,会有如下这样的语句,是没有问题的:

void * const *map;

map=modbus_map4;

 

 

volatile有相似的用法。

posted on 2012-04-09 22:12  lxjsailor  阅读(319)  评论(0编辑  收藏  举报

导航