这个习题需要注意以下知识点:
1. const int * p; 我们暂时称它为 "常量指针",即指向常量的指针.
他可以指向const 常量,也可以指向非 const的变量,但是都不能通过 p 来修改它指向的对象的值.
按照书里面的话说,
这种指针 一厢情愿的 认为,它所指向的东西是个 const类型的. 所以它没法修改.
但是如果它指向的是个变量 a,虽然不能通过 *p = 3; 来修改 a 的值,但是 a =3 这种不通过 常量指针
的修改 是允许的.
值得注意的是,只有 常量指针,才能指向 常量.
比如
const int a = 3;
int *p = &a ; int * const p = &a; 都是不合法的.
只有
const int * p = &a;
才是合法的.
2.
int * const p = &a; 我们暂时称它为 "指针常量", 即这种指针本身是个const 常量.
像所有的 const 常量一样,
它必须在定义的同时初始化,并且一旦初始化之后,就不能再改变它所指向的对象.
但是通过它来修改 它所指向的对象的值是可以的.
比如
int a = 3;
int * const p = &a;
*p = 5; // okay
int b = 2;
p = &b; // wrong
3.
const int * const p = &a; 这种指针是上面说的两种指针的结合.
即:
它本身是个 const 类型的 指针,所以它只能 指向一个对象,并且之后不能再修改;
同时,它也一厢情愿的以为,它所指向的对象是个 const 常量.
所以,通过它来修改它所指向的对象的值 是错误的.
4. 常量指针 & 指针常量 这两个概念,可以结合 iterator 来理解.
每种标准库类型,总提供一个 const_iterator.
比如 vector<int>::const_iterator. 这种 iterator 是不允许改变它所指向的 元素的值的.
比如
vector<int>::const_iterator it = vec.begin();
*it = 2; // wrong
这就好比 常量指针 .
另外可以声明一种 const 的 iterator .
比如 const vector<int>::iterator .这种 iterator 是不允许改变它的指向的.
比如
const vector<int>::iterator = vec.begin();
++it; // wrong
#include<iostream>
#include<string>
#include<vector>
using std::cin;
using std::cout;
using std::endl;
using std::vector;
using std::string;
int main()
{
int i = -1; // okay
const int ic = i; // okay
const int *pic = ⁣ // okay
int *const cpi = ⁣ // wrong , only "const int*" pointer can point to "const int" value
const int *const cpic = ⁣ // okay
int *const cpi = &i; // only for after test
i = ic; // okay
pic = ⁣ // okay
cpi = pic; // wrong, int *const can't change its point object
pic = cpi; // okay
cpic = ⁣ // wrong, int *const can't change its point object
ic = *cpic; // const int * can't modify the value of its point
return 0;
}