6


    //Example 1
    const double pie = 3.14;   //const object
    const double *cptr = &pie; //pointer-to-const to const object
    double *ptr = &pie;        //ERROR - non-pointer-to-const to const object

    //Example 2
    double pie = 3.14;         //non-const object
    const double *cptr = &pie; //non-pointer-to-const to non-const object
    double *ptr = &pie;        //non-pointer-to-const to non-const object


最初我虽然允许指向非常量对象的常量指针,因为它只是意味着指向常量的指针不会改变非常量对象。

但是我刚刚在 c++ 书中读到,允许将指针指向非 const 对象的原因是因为指向 const 的指针无法真正知道它指向的对象是否是 const,所以它对待对象它指向 const 但按照相同的逻辑,非指向 const 的指针会将 const 对象视为非 const 对象,但编译器会在编译时抛出错误。

我在这里错过了什么吗?

4

2 回答 2

6

声明一个 const 表示,“这个变量的值不应该改变。”

声明指向 const 的指针表示“我无意更改我指向的变量”。


问题1:为什么将指向变量的指针分配给const的地址时会出错?

// Example 1
const int i = 0;
int * p = &i;        /* Error */

答:因为第一行说,“请保证 的值i不会改变”,但是在第二行中编译器不能再做出保证——指针上的类型信息p不够严格,无法告诉编译器不要允许更改指向的值i


问题 2:为什么将指向 const 的指针分配给变量的地址时不会出错?

// Example 2
int j = 0;
const int * q = &j;  /* No error */

答案:因为指向 const 的指针说,“请保证 的值j不会通过q”改变。请注意,viaq很重要,因为指向 const 声明的指针并不意味着指向的值必须是常量,只是使用指针的人不能使用指针来更改值

于 2012-10-25T04:37:54.760 回答
2

指向常量的指针

const double *p

将它指向的对象视为常量对象,即不允许您更改它。只要您取消引用指针

*p

你正在处理一个常量对象。如果您尝试修改它,

*p = 1.0;

您将收到来自编译器的错误消息。

另一方面,指向非常量的指针

double *p

将它指向的对象视为非常量,因此允许您修改其值:

*p = 1.0;

变得合法。但是,如果在任何给定时间你有一个常量对象

const double d = 1.0;

您将无法创建指向它的指向非常量的指针:

double *p = &d;

不会被编译器接受。所以是的,编译器启用指向非常量的指针来修改它指向的对象。但它不能让您创建指向常量 object 的非 const 指针。因此,您不会遇到可以使用指向非 const 的指针来修改常量对象的情况。

关于标题中的问题:这主要是语言设计决定。然而,编译器可以依赖某些对象从不改变值的事实意味着各种优化是可能的。例如,如果同一个指针在函数中被解引用两次,而其他代码在两次解引用之间,并且如果该指针是指向 const 的指针,编译器将假定它实际上不必从内存中获取值两次,因为不允许在第一次和第二次取消引用之间更改该值。

于 2012-10-25T04:17:08.083 回答