1. 限定符声明变量只能被读
const int i=5;
int j=0;
...
i=j; //非法,导致编译错误
j=i; //合法
2. 必须初始化
const int i=5; //合法
const int j; //非法,导致编译错误
3. 在另一连接文件中引用const常量
extern const int i; //合法
extern const int j=10; //非法,常量不可以被再次赋值
4. const的难点在于与指针结合使用的时候,如下
char a[10];
const char *p = a; [1] //a是一个数组的首地址.p是指向常量的指针
char const *p = a; [2]
char* const p = a; [3] //a是一个数组的首地址.p是指针常量;
参考《Effective c++》Item21上的做法,如果const位于星号的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;如果const位于星号的 右侧,const就是修饰指针本身,即指针本身是常量。因此,[1]和[2]的情况相同,都是指针所指向的内容为常量(const放在变量声明符的位置无 关),下面详细分析一下。
——const char*p = a; //p是指向常量的指针,因此,不可以通过给指针赋值来改变数组中的数据,意思即是说p本身是可以变化的,
//p可以指向不同的地址,但是p指向的地址中存储的值是不能通过p来改变的,对p而言,必须是常量。
//例如,下列例子试图通过指针p来给数组a中的元素赋值就是不允许的:
// *p = 10; /*错误*/
// *(p + 2) = 1; /*错误*/
——char * const p = a; //这时候p是指针常量,我们知道,指针是指向了一个数组的首地址,那么,它的位置就不可以改变了。
//现在和第一个表达式比较,现在的数组并不是常量数组,所以数组的数据是可以改变的,但是指针这时
//候是不可以移动的,指针p指向数组的第一个数据所存储的位置,也只能指向这个位置。
//这一点请别误解,指针常量是指这个指针变量p的值(即p代表的地址)本身不可以改变(即p只能指向这个 //地址) ,并不是它指向的内容(p所指向的地址中存储的值)不可以改变,这一点切记!
//下面举几个例子帮助理解,可以通过p来给数组元素赋值,但是p是不能移动的:
// *p = 2; /*可以*/
// *(p+1) = 10; /*可以*/
// p++; /*不可以*/