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

Nib*_*bor 1 c pointers const-correctness

我知道在处理值时从non-constto 的隐式转换const并不危险,例如:

int mutable = 5;
const int immutable = mutable;
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

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

Sig*_*uza 5

来自C11 标准(草案 N1570)

6.7.3 类型限定符

句法

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

[...]

语义:

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

[...]

例 1

声明的对象

extern const volatile int real_time_clock;
Run Code Online (Sandbox Code Playgroud)

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

简单来说:

const并不意味着值永远不会改变。这仅意味着不能更改它1

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


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

  • “这只能说明,你不能改变它。” - 甚至不是!我的意思是**程序员**保证不修改它。 (3认同)