为什么首先允许从非const到const的隐式转换允许指针?

时间:2016-08-24 13:32:23

标签: c pointers const-correctness

我理解,在处理值时,从non-const隐式转换为const并不危险,例如:

int mutable = 5;
const int immutable = mutable;

但是,使用指针时,我可以执行以下操作:

int some_number = 5;
int *mutable = &some_number;
const int *immutable = mutable;    // <= Legal, but isn't it dangerous?

// Let's try to break const
printf("%d\n", *immutable);        // Prints 5
mutable[0] = 10;
printf("%d\n", *immutable);        // Prints 10

顺便说一句,对于双指针,这是不允许的(至少你得到一个警告)!请参阅this问题及其中的参考资料。

1 个答案:

答案 0 :(得分:4)

来自the C11 standard (draft N1570)

  

6.7.3类型限定符

     

语法

     
      
  1. 类型限定符:
      const
      restrict
      volatile
      _Atomic
  2.         

    [...]

         

    语义:

         
        
    1. 与限定类型关联的属性仅对作为左值的表达式有意义。
    2.         

      [...]

           

      示例1

           

      声明的对象

      extern const volatile int real_time_clock;
      
           

      可以由硬件修改,但不能分配,递增或递减。

简单来说:

const并不意味着价值永远不会改变。这只意味着不允许改变 1

对于被调用者const是限制,而不是承诺 但是对于来电者 是一个承诺。将const指针传递给函数,您可以安全地假设该函数不会更改您的数据 2 ,因此就是“向您做出承诺”。

1 ...通过带有const限定符的标识符。
2 ...通过传递给它的const参数。