顶层const和底层const c++

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用的较多。

原文地址:https://www.cnblogs.com/min2day/p/12639812.html