我们知道可以使用const来创建符号常量;
const double PI = 3.14159;当然,以上也可以使用#define来实现。但使用const还可以创建数组常量、指针常量以及指向常量的指针。
一)用const保护数组
#define MONTHS 12
...
const int days[MONTHS] = {31,28,31};
如果随后的程序代码试图改变数组,编译时将报错
days[9] = 44;
二)常量指针(“左定值”)
指向常量的指针不能用于修改数值,顾名思义,常量是形容词用来修饰指针这个名词的,常量指针的本质还是指针,常量表示这个指针是一个指向常量的指针(实际上是个变量)。
指向常量的指针不能用于修改数值,考虑下列代码:
double rates[5] = {88.23, 99.34, 100.12, 33.45, 183.11};
const double *pd = rates; //pd指向数组开始处
const只修饰其后的变量,至于const放在类型前还是类型后并没有区别,此例中const只修饰(pd),而间接运算符是右结合性,所以第二行代码把pd声明为指向const double的指针,这样,就不可以使用pd来修改它所指向的数值,即*pd不可以修改,无论是采用数组符号还是指针符号。而rates并没有声明为常量,所以,仍可以使用rates来修改其数值。但是,还可以让pd指向其他地址。
三)指针常量(右定向)
这种情况下,指针是形容词用来修饰常量这个名词的,指针常量的本质是一个常量,这个常量的值应该是一个指针,考虑下面代码:
double rates[5] = {88.23, 99.34, 100.12, 33.45, 183.11};
double * const pd = rates; //pd指向数组开始处
pd = &rates[2]; //不允许
*pd = 23.43; //可以更改rates[0]的值
这样的指针仍然可以用来修改数据,但是它只能指向最初赋给它的地址。
因为指针常量是一个常量,在声明时就一定要给他赋初值,一旦赋值,以后这个常量再也不能指向别的地址。
但是它指向的对象是可以改变的,因为我们并没有限制它指向的对象是常量。
(*不是一种类型,而是运算符)
最后,口诀:
const(*号)左边放,我是指针变量指向常量;
const(*号)右边放,我是指针常量指向变量;
const(*号)两边放,我是指针常量指向常量;
指针变量能改指向,指针常量不能转向!
要是全都变成常量,锁死了,我不能转向,你也甭想变样