C++指向常量的指针和常指针

C++指向常量的指针和常指针

指向常量的指针

通常情况下,可以通过指针去修改指针指向的内容.但是在某些情况下,只希望通过指针去访问指针指向的内容,不想修改.比如只想通过树根结点的指针去遍历输出树中所有结点的内容,不修改.这时候就可以使用指向常量的指针,防止意外修改.
看下面的代码

const int* u;

const int* u;可以读作:u是一个指针,该指针指向不能通过该指针修改的内容.重点在不能通过该指针修改的内容,也就是说u指向的内容不能通过u来修改,但是可以通过别的方法修改.看下面的代码和注释.

#include <iostream>
using namespace std;
int main() {
    int a = 3;
    const int* u;
    u = &a; //初始化u
    cout << "*u=" << *u << endl;

    /* 试图通过u修改u指向的内容,直接报错.
        *u = 3; 
        cout << "*u=" << *u << endl;
    */

    /*通过另外一个变量的指针修改u指向的内容是正确的.*/
    int b = 4;
    u = &b;
    cout << "*u=" << *u << endl;

    /*通过另外一个指针修改u指向的内容也是正确的.*/
    int *c = &b;
    *c = 100;
    cout << "*u=" << *u << endl;
}

指向常量的指针还有一种等价的定义方式, int const* u; int const* u和const int* u的意义完全相同.

常指针

看下面的代码.

#include <iostream>
using namespace std;
int main() {
    int d = 1;
    int* const w = &d;
    return 0;
}

int* const w = &d读作:w是一个指针,这个指针是一个不能修改的(int型)指针.重点在不能修改的指针,也就是说w不可以被修改,但w指向的内容是可以修改的.看下面的代码和注释.

#include <iostream>
using namespace std;
int main() {
    int d = 1;
    int* const w = &d;

    /* 试图修改w,直接报错.
    int e =2;
    w = &e;
    */

    /*可以修改w指向的内容*/
    *w = 6;
    cout << "*w=" << *w << endl;
    *w = 7;
    cout << "*w=" << *w << endl;
    return 0;
}

参考资料
Bruce Eckel. Thinking in C++, Volume 1, 2nd Edition.pp360-362. 2000.

posted on 2016-07-24 11:11  荷楠仁  阅读(262)  评论(0编辑  收藏  举报

导航