c++ pp page 182
将指针和const结合有两种用法:
1.让指针指向一个常量对象,即该指针是一个指向 const 的指针(指向常量的指针),这样可以防止使用该指针来修改其指向的那个值,但是可以改变指针指向的位置
int age = 30; const int * pt = &age;
上述代码声明了一个指向const int 的指针(const int * 是一种类型,是指向const int 的指针)
在上述代码中,不能使用指针pt来修改age的值,如
*pt = 20; //not allowed cin>>*pt; //not allowed
但由于变量age并不是一个常量变量,所以仍然可以使用age变量来修改自己的值
age = 10; //allowed
上述代码表明,可以将常规变量的地址赋给 指向const的指针(但仅当只有一层间接关系时,如指针指向基本数据时,才可以将非const地址或指针赋给const指针);
我们可以使用const在传递数组参数时保护原数据,即在声明形参时使用关键字const(c++ pp page179)
void show(const int * arr); //or void show(const int arr[]) int main() { int a[3] = {1,2,3}; show(a); } void show(a) { ... }
注意上述代码中show()函数进行原型声明时,使用了const关键字,可以防止函数无意中修改数组的内容。
要注意,如果是常量变量(const 变量),则只能将其赋给 指向const的指针,即,不能将const的地址赋给常规指针,如下所示:
const float a = 1.63; float * b = &a; //not allowed
所以,如果有一个由const数据组成的数组,我们就不能将该常量数组的地址赋给非常量指针,这就意味着不能将数组名作为参数传递给使用非常量形参的函数:
const int month[12] = {31,28,31,30,31,30,31,31,30,31,30,31}; int sum(int arr[] , int n); //should have been const int arr[] ... int j = sum(month,12);//now allowed
2.将指针本身声明为常量,这样可以防止改变指针指向的位置
int b = 3; int * const a = &b;
上述代码中,指针a只能指向b,不能指向其他地方;但可以通过 *a 修改b的值。
注意:
int b = 3; const int * a = &a;//一个指向const int 的指针 int * const a = &a;//一个const指针指向int