一个例子说明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来修改数据,但其实这个变量是可以修改的,就如上边第三个赋值语句所示的方法。
volatile有相似的用法。