我理解,在处理值时,从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问题及其中的参考资料。
答案 0 :(得分:4)
来自the C11 standard (draft N1570):
6.7.3类型限定符
语法
- 类型限定符:
醇>
const
restrict
volatile
_Atomic
[...]
语义:
- 与限定类型关联的属性仅对作为左值的表达式有意义。
醇>[...]
示例1
声明的对象
extern const volatile int real_time_clock;
可以由硬件修改,但不能分配,递增或递减。
简单来说:
const
并不意味着价值永远不会改变。这只意味着你不允许改变 1 。
对于被调用者,const
是限制,而不是承诺
但是对于来电者, 是一个承诺。将const
指针传递给函数,您可以安全地假设该函数不会更改您的数据 2 ,因此就是“向您做出承诺”。
1 ...通过带有const
限定符的标识符。
2 ...通过传递给它的const
参数。