为何int *const类型变量无法用const int *类型右值初始化?
核心原因是类型不匹配,违反了C语言的const语义保护规则
首先明确指针中const修饰符的作用规则:
- const 修饰符的作用范围遵循「左优先,无左则右」原则:
- 如果
const放在*左侧,修饰的是指针指向的内容,意味着不能通过该指针修改指向的变量值,指针本身存储的地址可以修改 - 如果
const放在*右侧,修饰的是指针本身,意味着指针存储的地址不能修改,但可以通过该指针修改指向的变量值
- 如果
针对你遇到的场景分析如下:
- 你定义的
const int r = 3中,r是只读变量,取地址后&r的类型是const int *,代表这个地址指向的内容是只读的,不允许被修改 - 你定义的
int *const ptr中,const仅放在*右侧,确实只是限制指针本身的地址不能修改,但这个指针的基础类型是指向普通int的指针,隐含了「可以通过该指针修改指向内容」的语义
如果编译器允许二者赋值,你后续就可以通过*ptr = 5这类操作修改原本是const的r的值,直接打破了r的只读限制,属于违反类型安全的操作,所以编译器会直接抛出报错拦截。
你把r改成普通int就能编译通过的原因也很简单:普通int变量取地址后的类型是int *,和int *const的指向类型完全匹配,只是多了指针本身不能修改的限制,不会违反const语义。
如果需要定义一个本身不能修改、同时也不能通过它修改指向内容的指针来匹配const int类型的r,可以改成如下写法:
const int r = 3; const int *const ptr = &r;
上述写法同时满足了「指针地址不能改」和「不能通过指针修改r的值」两个约束,类型匹配可以正常编译。
内容的提问来源于stack exchange,提问作者kaiyu wei
相关产品推荐
相关产品推荐

