指针与 const --- 指针常量与常量指针

Posted Waming

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了指针与 const --- 指针常量与常量指针相关的知识,希望对你有一定的参考价值。

注:该文主要来源于 网易公开课之《C++ 程序设计入门(上)》课件。

在 C 语言标准中,const 修饰的变量称之为 只读变量,

在 C++ 语言标准中,const 修饰的变量称之为 常量,

例:

    const int ARRAY_LEN = 100;

    int array[ARRAY_LEN];    //该语句在C++ 编译器中是可行的,但是在C编译器中是会报错的

以上是 const 在 C 和 C++ 中的差别,下边主要介绍 const 与指针:

1. 指针的两个属性

    a. 指针变量本身

    b. 指针变量所指向的内容

2. 常量指针和指针常量

    a. 常量指针(常指针):指针(p)所指向的内容不能通过指针的间接引用(*p)来改变

    例:

        const int i = 0;

        const int* p1 = &i;    //指针 p1 的类型是 const int*

        *p1 = 10;    //error

    b. 指针常量:指针本身的内容是一个常量,不可以改变

    例:

        int a = 1;

        int b = 2;

        int* const p = &a;    //常量 p2 的类型是 int*

        *p2 = 10;    //ok, a = 10

        p = &b;    //error

 

注:数组名是数组首地址的别名,可以说 数组名就是一个指针常量,所以 :

    int a[] = {1, 2, 3, 4};

    a = a + 1;    //error

3. 变量、常量和常量指针

    a. 

        int i = 10;

        int const *pi = &i;

        *pi = 11;    //error

        i = 11;    //ok

        上述语句只是说明 pi 指向的地址中所存的内容不能通过 *pi 的方式被改变;

    b. 

        const int ci = 10;

        const int* pci = &ci;

        *pci = 11;    //error

        ci = 11;    //error

        上述语句说明 ci 是一个常量,存放在常量区,不能被改变,pci 指向的地址中所存的内容不能通过 *pci 的方式被改变;

    c.

        const int ci = 10;

        int* pci = &ci;    //error

        上述语句说明 ci 是一个常量,存放在常量区,不能被改变,也不能通过 *pci 的方式被改变,所以指向 ci 的指针必须是常量指针。

总结:

    const int* p;    //语句1

    int const *p;    //语句2

    int* const p;    //语句3

    在前先读,在前不变

    ① *(指针) 和 const(常量)谁在前先读谁;

    ② * 代表被指的数据,名字代表指针地址;

    ③ const 在谁的前面谁就不能被改变。

    ④ 语句1 和语句2 等价

 

以上是关于指针与 const --- 指针常量与常量指针的主要内容,如果未能解决你的问题,请参考以下文章

C++中常量引用指针常量指针指针常量常量引用顶层常量与底层常量

C++中常量引用指针常量指针指针常量常量引用顶层常量与底层常量

C++中常量引用指针常量指针指针常量常量引用顶层常量与底层常量

指针和引用指针常量与常量指针

C++ 常量指针与指针常量

指针常量与常量指针的区别