2018-12-03

const 与 多重指针

先让我们来看const与指针的情况

#include

int main()
{
    int apple = 3;
    const int *p1=&apple;/*p1是一个指向int型常量的指针,虽然apple不是常量,但傻乎乎的p1以为它是个常量,因此不能通过p1修改apple的值*/
    int const *p2=&apple;/*和上面的没有区别,const在int的左右都一样*/
    int  * const p3 = &apple;/*这里的p3是一个常量指针,也就是说不能修改p3的值,但我们可以通过p3修改apple的值*/
}

然而,当const碰到多重指针的时候,情况就会变得复杂起来,我们可能会有

const int ** p1 = &p;
int const ** pp2 = &p;
int *const* pp3 = &p;
int **const pp4 = &p;

这四种情况 , 看起来很恶心,其实也不难


const int ** pp1 = &p;
int const ** pp2 = &p;

依然是相同的,他们表示pp指向一个指向int型常量的int型指针(即c++ primer中所说的底层指针),比如

#include

int main(void)
{
    int apple=3;
    const int * p = &apple;
    /*如果p的定义为 int * p = &apple,则下面两句就会报错 */
    const int ** pp1 = &p;
    int const ** pp2 = &p;
    //*(*pp1) = 5;这句会报错
    return 0;
}

int *const* pp3 = &p;

表示pp3指向一个常量指针(即c++ primer 中说的顶层指针),比如

#include
int main(void)
{
    int apple=3;
    int banana = 2;
    int * const p = &apple;
    int *const* pp3 = &p;
    //*(*pp3) = &banana;这句会报错
    return 0;
}

int **const pp4 = &p;

则表示pp4本身是一个常量,比如

int main(void)
{
    int apple=3;
    int * p1 = &apple;
    int * p2 = &apple;
    int ** const pp4 = &p1;
    //pp4 = &p2;这句会报错
    return 0;
}

你可能感兴趣的:(2018-12-03)