指针与const (C++11)

1.cosnt指针

    int age = 39;
    const int * pt = &age;

不可以使用pt改变age的值,即*pt是const,不可修改。

    *pt += 1;      // 非法操作
    cin >> *pt;    // 非法操作

但是,pt的声明并不意味着它指向的变量(age)为const,而仅仅是说不可以使用pt来修改它指向的变量(age)。

    *pt = 20;      // 非法操作
    age = 20;      // ok

2.指向const对象的指针

2.1指向const对象的const指针

    const float g_earth = 9.80;
    const float * pe = &g_earth;   // ok

g_earth 和 pe都为const,都不可以用来修改其所对应的值(9.80)。

2.2指向const对象的非const指针

C++不允许把const地址赋值给非const指针。

    const float g_moon = 1.63;
    float * pm = &g_moon;   // 非法操作

当然,你也可以使用类型转换突破此限制。

3.指向指针的指针

    const int **pp2;
    int *p1;
    const int n = 13;
    pp2 = &p1;      // 非法操作。先假设合法。
    *pp2 = &n;      // ok,两者都是const,但 p1 = &n 非法。
    *p1 = 10;       // 此行的语法是合法的,但不能成功修改n。

因此,把非const地址或指针赋值给const指针的操作只在一次间接地址操作的情况下适用。换句话说,可以把const或者非const的数据赋值给const指针,只要此数据本身不是指针类型。

4.const参数

    const int months[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    ...
    int sum(int arr[], int n);  // 应该是 const int arr[]
    int j = sum(months, 12);    // 非法

上面的函数调用试图把const指针(months)赋值给非const指针(arr),将产生编译错误。

小建议:
只要能够使用const,就使用。建议给指针声明添加const有两个原因:
1.可以防止无意的修改数据;
2.使用const允许函数处理const和非const的实参。如果在函数原型中省略const,则函数只可以接受非const的数据;
3.const引用做函数参数,可以让函数在需要的临时变量的时候生成中间变量;
只要可以,建议把形参声明为const指针。

你可能感兴趣的:(const-指针)