1. 普通的指针
int i = 10, j = 30; int* pi = &i; // pi 指向 i 的地址 *pi = 50; // 通过 *pi 可以改变指针指向地址的值 cout << *pi << " " << i << endl; // 50 50 pi = &j; // pi 指向 j 的地址 cout << *pi << " " << j << endl; // 30 30
pi 是指向 int 类型的指针。在没有const的情况下,pi 指向的地址可以改变,在以上代码中 pi 先是指向 i 的地址,后又指向 j 的地址。
通过 *pi 指针解引用,可以改变它所指向的地址的值。
2. 底层const
int i = 10, j = 50;
const int* pi = &i;
cout << *pi << endl;
// *pi = 9; // 错误
i = 40;
cout << *pi << " " << i << endl; // 40 40
pi = &j;
cout << *pi << " " << j << endl; // 50 50
const in* pi = &i 这句话中,const 修饰的是 *pi ,也就是 pi 指向的值是常量。这时我们不可以通过操作 *pi 来改变 pi 所指向的地址内的值。
pi 本身还是一个可以改变的指针变量,在以上代码中 pi 先是指向 i 的地址,后又指向 j 的地址。
3.顶层const
int i = 10, j = 50; int* const pi = &i; cout << *pi << endl; // pi = &j; // 错误
*pi = 33;
cout << *pi << " " << i << endl;
int* const pi = &i 这句话中, const 修饰的是 pi,也就是 pi 这个指针本身是常量,它在定义时初始化为 i 的地址。后面就不能再指向别的地址了。
但我们还可通过 *pi 来改变指针指向地址的值。
总结,看const 修饰的是 指针指向地址的值,还是 指针本身。前者是底层const,后者是顶层const。底层const用的较多。