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)
顺便说一句,对于双指针,这是不允许的(至少您会收到警告)!请参阅此问题及其中的参考资料。
6.7.3 类型限定符
句法
- 类型限定符:
const
restrict
volatile
_Atomic[...]
语义:
- 与限定类型关联的属性仅对左值表达式有意义。
[...]
例 1
声明的对象
Run Code Online (Sandbox Code Playgroud)extern const volatile int real_time_clock;可由硬件修改,但不能分配、递增或递减。
简单来说:
const并不意味着值永远不会改变。这仅意味着您不能更改它1。
对于被调用者来说,const是一个限制,而不是一个承诺。然而,
对于来电者来说,这是一个承诺。传递一个const指向函数的指针,您可以安全地假设该函数不会更改您的数据2,因此是“向您做出承诺”。
1 ...通过带有const限定符的标识符。
2 ...通过const传递给它的参数。